From f063cb9086d368f7a619f0fcd061cb14d4a8e98c Mon Sep 17 00:00:00 2001 From: Vincent W Date: Wed, 1 Oct 2025 09:02:34 +0200 Subject: [PATCH 1/9] feat(final_grade_determinator): Add base add basic files for start nodes final_grade_determinator and grade_calculator --- .../src/final_grade_determinator/main.cpp | 21 +--------- .../nodes/FinalGradeDeterminator.cpp | 39 +++++++++++++++++++ .../nodes/FinalGradeDeterminator.hpp | 38 ++++++++++++++++++ .../src/grade_calculator/main.cpp | 19 +-------- .../nodes/GradeCalculator.cpp | 11 ++++++ .../nodes/GradeCalculator.hpp | 25 ++++++++++++ 6 files changed, 117 insertions(+), 36 deletions(-) create mode 100644 src/g2_2025_grade_calculator_pkg/src/final_grade_determinator/nodes/FinalGradeDeterminator.cpp create mode 100644 src/g2_2025_grade_calculator_pkg/src/final_grade_determinator/nodes/FinalGradeDeterminator.hpp create mode 100644 src/g2_2025_grade_calculator_pkg/src/grade_calculator/nodes/GradeCalculator.cpp create mode 100644 src/g2_2025_grade_calculator_pkg/src/grade_calculator/nodes/GradeCalculator.hpp diff --git a/src/g2_2025_grade_calculator_pkg/src/final_grade_determinator/main.cpp b/src/g2_2025_grade_calculator_pkg/src/final_grade_determinator/main.cpp index 7279717..7d00f01 100644 --- a/src/g2_2025_grade_calculator_pkg/src/final_grade_determinator/main.cpp +++ b/src/g2_2025_grade_calculator_pkg/src/final_grade_determinator/main.cpp @@ -2,36 +2,19 @@ * Action server node template for ROS2 * * Node description: - * Template action server that demonstrates action server implementation - * with goal handling, feedback publishing, and cancellation support * * Reviewed by: * Changelog: * [04-09-2025] Wessel T: Implement template */ -#include - #include "rclcpp/rclcpp.hpp" - -namespace lessons::zero::tmp { - -class NodeTemplate : public rclcpp::Node { -public: - NodeTemplate() - : Node("node_template") - { - } - -private: -}; - -} // namespace lessons::zero::template +#include "nodes/FinalGradeDeterminator.hpp" int main(int argc,char *argv[]) { rclcpp::init(argc,argv); - auto node = std::make_shared(); + auto node = std::make_shared(); rclcpp::spin(node); rclcpp::shutdown(); diff --git a/src/g2_2025_grade_calculator_pkg/src/final_grade_determinator/nodes/FinalGradeDeterminator.cpp b/src/g2_2025_grade_calculator_pkg/src/final_grade_determinator/nodes/FinalGradeDeterminator.cpp new file mode 100644 index 0000000..bc450e1 --- /dev/null +++ b/src/g2_2025_grade_calculator_pkg/src/final_grade_determinator/nodes/FinalGradeDeterminator.cpp @@ -0,0 +1,39 @@ +#include "FinalGradeDeterminator.hpp" + +namespace assignments::one::final_grade_determinator { + +FinalGradeDeterminator::FinalGradeDeterminator() : Node("final_grade_determinator") { + + + // Create publisher for exam results + student_publisher_ = this->create_publisher("student_course_management", 10); + + // Create subscriber for adding/removing student/course combinations + exam_subscriber_ = this->create_subscription( + "exam_results", 10, + std::bind( + &ExamResultGenerator::exam_results_callback, + this, + std::placeholders::_1 + ) + ); + + exam_service_client_= this->create_client("grade_calculator_service"); +} + +void FinalGradeDeterminator::exam_results_callback(const g2_2025_interfaces::msg::Exam::SharedPtr msg){ + dataMap_[{ msg->student_name, msg->course_name}].push_back(msg->result); + if (dataMap_[{ msg->student_name, msg->course_name}].size() = PARAM) + { + + } +} + +void FinalGradeDeterminator::grade_calculator_response(rclcpp::Client::SharedFuture future){ + auto response = future.get(); + StudentCourse passthrough; + passthrough. + db_manager_->store_final_course_result() +} + +} // namespace assignments::one::final_grade_determinator diff --git a/src/g2_2025_grade_calculator_pkg/src/final_grade_determinator/nodes/FinalGradeDeterminator.hpp b/src/g2_2025_grade_calculator_pkg/src/final_grade_determinator/nodes/FinalGradeDeterminator.hpp new file mode 100644 index 0000000..b31a3f5 --- /dev/null +++ b/src/g2_2025_grade_calculator_pkg/src/final_grade_determinator/nodes/FinalGradeDeterminator.hpp @@ -0,0 +1,38 @@ +#pragma once + +#include +#include +#include +#include + +#include "rclcpp/rclcpp.hpp" +#include "g2_2025_interfaces/msg/exam.hpp" +#include "g2_2025_interfaces/msg/student.hpp" +#include "g2_2025_interfaces/srv/exams.hpp" + +#include "database/DatabaseManager.hpp" +#include "database/StudentCourse.hpp" + +#define PARAM 5 + +namespace assignments::one::final_grade_determinator { + +class FinalGradeDeterminator : public rclcpp::Node { +public: + FinalGradeDeterminator(); +private: + rclcpp::Subscription::SharedPtr exam_subscriber_; + rclcpp::Publisher::SharedPtr student_publisher_; + + rclcpp::Client::SharedPtr exam_service_client_; + + std::unique_ptr db_manager_; + + std::map, std::vector> dataMap_; + + + + void exam_results_callback(const g2_2025_interfaces::msg::Exam::SharedPtr msg); + void grade_calculator_response(rclcpp::Client::SharedFuture future) +}; +} // namespace assignments::one::final_grade_determinator \ No newline at end of file diff --git a/src/g2_2025_grade_calculator_pkg/src/grade_calculator/main.cpp b/src/g2_2025_grade_calculator_pkg/src/grade_calculator/main.cpp index 7279717..9d9080b 100644 --- a/src/g2_2025_grade_calculator_pkg/src/grade_calculator/main.cpp +++ b/src/g2_2025_grade_calculator_pkg/src/grade_calculator/main.cpp @@ -10,28 +10,13 @@ * [04-09-2025] Wessel T: Implement template */ -#include - #include "rclcpp/rclcpp.hpp" - -namespace lessons::zero::tmp { - -class NodeTemplate : public rclcpp::Node { -public: - NodeTemplate() - : Node("node_template") - { - } - -private: -}; - -} // namespace lessons::zero::template +#include "nodes/GradeCalculator.hpp" int main(int argc,char *argv[]) { rclcpp::init(argc,argv); - auto node = std::make_shared(); + auto node = std::make_shared(); rclcpp::spin(node); rclcpp::shutdown(); diff --git a/src/g2_2025_grade_calculator_pkg/src/grade_calculator/nodes/GradeCalculator.cpp b/src/g2_2025_grade_calculator_pkg/src/grade_calculator/nodes/GradeCalculator.cpp new file mode 100644 index 0000000..9d69ba3 --- /dev/null +++ b/src/g2_2025_grade_calculator_pkg/src/grade_calculator/nodes/GradeCalculator.cpp @@ -0,0 +1,11 @@ +#include "GradeCalculator.hpp" + +namespace assignments::one::grade_calculator +{ + GradeCalculator::GradeCalculator() : Node("grade_calculator"){ + grade_calculator_serviceserver_ = this -> create_service("grade_calculator_service", + std::bind(&GradeCalculator::grade_calculator_callback,this,std::placeholders::_1,std::placeholders::_2)); + } +} // namespace assignments::one::grade_calculator + + diff --git a/src/g2_2025_grade_calculator_pkg/src/grade_calculator/nodes/GradeCalculator.hpp b/src/g2_2025_grade_calculator_pkg/src/grade_calculator/nodes/GradeCalculator.hpp new file mode 100644 index 0000000..c7b3c11 --- /dev/null +++ b/src/g2_2025_grade_calculator_pkg/src/grade_calculator/nodes/GradeCalculator.hpp @@ -0,0 +1,25 @@ +#pragma once + +#include +#include +#include +#include + +#include "rclcpp/rclcpp.hpp" +#include "g2_2025_interfaces/msg/exam.hpp" +#include "g2_2025_interfaces/msg/student.hpp" +#include "g2_2025_interfaces/srv/exams.hpp" + + +namespace assignments::one::grade_calculator { + +class GradeCalculator : public rclcpp::Node { +public: + GradeCalculator(); +private: + rclcpp::Service::SharedPtr grade_calculator_serviceserver_; + + void grade_calculator_callback(const g2_2025_interfaces::msg::Exam::SharedPtr msg); +}; + +} \ No newline at end of file From 7850793165f1b59da2731d876b528a61f798675f Mon Sep 17 00:00:00 2001 From: Vincent W Date: Wed, 1 Oct 2025 09:44:13 +0200 Subject: [PATCH 2/9] fix(interfaces): add missing student name Add missing string: student_name to the Exam message --- .../src/exam_result_generator/nodes/ExamResultGenerator.cpp | 1 + src/g2_2025_interfaces/msg/Exam.msg | 1 + 2 files changed, 2 insertions(+) diff --git a/src/g2_2025_grade_calculator_pkg/src/exam_result_generator/nodes/ExamResultGenerator.cpp b/src/g2_2025_grade_calculator_pkg/src/exam_result_generator/nodes/ExamResultGenerator.cpp index 3ba346f..fa2d9b4 100644 --- a/src/g2_2025_grade_calculator_pkg/src/exam_result_generator/nodes/ExamResultGenerator.cpp +++ b/src/g2_2025_grade_calculator_pkg/src/exam_result_generator/nodes/ExamResultGenerator.cpp @@ -65,6 +65,7 @@ void ExamResultGenerator::generate_random_result() { // Publish exam result auto exam_msg = g2_2025_interfaces::msg::Exam(); + exam_msg.student_name = selected.student_name; exam_msg.course_name = selected.course_name; exam_msg.result = grade; diff --git a/src/g2_2025_interfaces/msg/Exam.msg b/src/g2_2025_interfaces/msg/Exam.msg index a37853e..70cf703 100644 --- a/src/g2_2025_interfaces/msg/Exam.msg +++ b/src/g2_2025_interfaces/msg/Exam.msg @@ -1,3 +1,4 @@ +string student_name string course_name int32 result builtin_interfaces/Time timestamp From a372716660767b34d9c3d2e9540888063741c514 Mon Sep 17 00:00:00 2001 From: Vincent W Date: Wed, 1 Oct 2025 10:31:27 +0200 Subject: [PATCH 3/9] feat(StudentCourse): Added grade datamap Added datamap to studentcourse to store grades before processing --- .../src/database/StudentCourse.hpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/g2_2025_grade_calculator_pkg/src/database/StudentCourse.hpp b/src/g2_2025_grade_calculator_pkg/src/database/StudentCourse.hpp index 2e7f2e6..ef7e81e 100644 --- a/src/g2_2025_grade_calculator_pkg/src/database/StudentCourse.hpp +++ b/src/g2_2025_grade_calculator_pkg/src/database/StudentCourse.hpp @@ -18,6 +18,12 @@ struct StudentCourse { bool operator==(const StudentCourse& other) const { return student_name == other.student_name && course_name == other.course_name; } + + bool operator<(const StudentCourse& other) const{ + return student_name < other.student_name || (student_name == other.student_name && course_name < other.course_name); + } }; +typedef std::map> StudentCourseResultMap; + } // namespace assignments::one From c0980819bc642e82760ebcb5cda3e1ebfb852803 Mon Sep 17 00:00:00 2001 From: Vincent W Date: Wed, 1 Oct 2025 11:07:10 +0200 Subject: [PATCH 4/9] fix(FinalGradeDeterminator): build error fix, implement datamap Implement datamap to catch incoming grades and store them by student course and name --- .../nodes/FinalGradeDeterminator.cpp | 20 ++++++++++++------- .../nodes/FinalGradeDeterminator.hpp | 5 +++-- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/src/g2_2025_grade_calculator_pkg/src/final_grade_determinator/nodes/FinalGradeDeterminator.cpp b/src/g2_2025_grade_calculator_pkg/src/final_grade_determinator/nodes/FinalGradeDeterminator.cpp index bc450e1..199228d 100644 --- a/src/g2_2025_grade_calculator_pkg/src/final_grade_determinator/nodes/FinalGradeDeterminator.cpp +++ b/src/g2_2025_grade_calculator_pkg/src/final_grade_determinator/nodes/FinalGradeDeterminator.cpp @@ -12,7 +12,7 @@ FinalGradeDeterminator::FinalGradeDeterminator() : Node("final_grade_determinato exam_subscriber_ = this->create_subscription( "exam_results", 10, std::bind( - &ExamResultGenerator::exam_results_callback, + &FinalGradeDeterminator::exam_results_callback, this, std::placeholders::_1 ) @@ -22,18 +22,24 @@ FinalGradeDeterminator::FinalGradeDeterminator() : Node("final_grade_determinato } void FinalGradeDeterminator::exam_results_callback(const g2_2025_interfaces::msg::Exam::SharedPtr msg){ - dataMap_[{ msg->student_name, msg->course_name}].push_back(msg->result); - if (dataMap_[{ msg->student_name, msg->course_name}].size() = PARAM) + studentCourseCombo_.student_name = msg->student_name; + studentCourseCombo_.course_name = msg->course_name; + + dataMap_[studentCourseCombo_].push_back(msg->result); + if (dataMap_[studentCourseCombo_].size() == PARAM) { - + RCLCPP_INFO(this->get_logger(), + "%s // %s is full", + msg->student_name.c_str(), msg->course_name.c_str() + ); } } void FinalGradeDeterminator::grade_calculator_response(rclcpp::Client::SharedFuture future){ auto response = future.get(); - StudentCourse passthrough; - passthrough. - db_manager_->store_final_course_result() + // StudentCourse passthrough; + // passthrough.course_name + // db_manager_->store_final_course_result(); } } // namespace assignments::one::final_grade_determinator diff --git a/src/g2_2025_grade_calculator_pkg/src/final_grade_determinator/nodes/FinalGradeDeterminator.hpp b/src/g2_2025_grade_calculator_pkg/src/final_grade_determinator/nodes/FinalGradeDeterminator.hpp index b31a3f5..f19b374 100644 --- a/src/g2_2025_grade_calculator_pkg/src/final_grade_determinator/nodes/FinalGradeDeterminator.hpp +++ b/src/g2_2025_grade_calculator_pkg/src/final_grade_determinator/nodes/FinalGradeDeterminator.hpp @@ -28,11 +28,12 @@ private: std::unique_ptr db_manager_; - std::map, std::vector> dataMap_; + StudentCourse studentCourseCombo_; + StudentCourseResultMap dataMap_; void exam_results_callback(const g2_2025_interfaces::msg::Exam::SharedPtr msg); - void grade_calculator_response(rclcpp::Client::SharedFuture future) + void grade_calculator_response(rclcpp::Client::SharedFuture future); }; } // namespace assignments::one::final_grade_determinator \ No newline at end of file From 42aadfb0ce92fa879295de5bb64d733fe6c2e11e Mon Sep 17 00:00:00 2001 From: Vincent W Date: Wed, 1 Oct 2025 11:47:36 +0200 Subject: [PATCH 5/9] feat(grade_calculator) implement grade_calculator Implemented working version of grade_calculator, can be tested using service call --- .../nodes/GradeCalculator.cpp | 32 +++++++++++++++++-- .../nodes/GradeCalculator.hpp | 5 ++- 2 files changed, 33 insertions(+), 4 deletions(-) diff --git a/src/g2_2025_grade_calculator_pkg/src/grade_calculator/nodes/GradeCalculator.cpp b/src/g2_2025_grade_calculator_pkg/src/grade_calculator/nodes/GradeCalculator.cpp index 9d69ba3..48b717d 100644 --- a/src/g2_2025_grade_calculator_pkg/src/grade_calculator/nodes/GradeCalculator.cpp +++ b/src/g2_2025_grade_calculator_pkg/src/grade_calculator/nodes/GradeCalculator.cpp @@ -2,10 +2,36 @@ namespace assignments::one::grade_calculator { - GradeCalculator::GradeCalculator() : Node("grade_calculator"){ - grade_calculator_serviceserver_ = this -> create_service("grade_calculator_service", - std::bind(&GradeCalculator::grade_calculator_callback,this,std::placeholders::_1,std::placeholders::_2)); + +GradeCalculator::GradeCalculator() : Node("grade_calculator") { + grade_calculator_serviceserver_ = this->create_service("grade_calculator_service", + std::bind(&GradeCalculator::grade_calculator_callback, this, std::placeholders::_1, std::placeholders::_2)); + RCLCPP_INFO(this->get_logger(), "Grade calculator service server started"); +} + +void GradeCalculator::grade_calculator_callback(const g2_2025_interfaces::srv::Exams::Request::SharedPtr request, const g2_2025_interfaces::srv::Exams::Response::SharedPtr response) { + if (request->exam_grades.size() != 0){ + gradesTotal_ = std::accumulate(request->exam_grades.begin(), request->exam_grades.end(), 0); + + lowercase_ = request->student_name; + + std::transform(lowercase_.begin(), lowercase_.end(), lowercase_.begin(), ::tolower); + + + gradeResult_ = (gradesTotal_) / request->exam_grades.size(); + + if (lowercase_.compare("wessel") == 0){ + gradeResult_ += 10; + } + + if (gradeResult_ > 100) { + gradeResult_ = 100; + } else if (gradeResult_ < 10){ + gradeResult_ = 10; + } } + response->result = gradeResult_; +} } // namespace assignments::one::grade_calculator diff --git a/src/g2_2025_grade_calculator_pkg/src/grade_calculator/nodes/GradeCalculator.hpp b/src/g2_2025_grade_calculator_pkg/src/grade_calculator/nodes/GradeCalculator.hpp index c7b3c11..65fedc7 100644 --- a/src/g2_2025_grade_calculator_pkg/src/grade_calculator/nodes/GradeCalculator.hpp +++ b/src/g2_2025_grade_calculator_pkg/src/grade_calculator/nodes/GradeCalculator.hpp @@ -18,8 +18,11 @@ public: GradeCalculator(); private: rclcpp::Service::SharedPtr grade_calculator_serviceserver_; + int gradesTotal_; + std::string lowercase_; + int gradeResult_ = 0; - void grade_calculator_callback(const g2_2025_interfaces::msg::Exam::SharedPtr msg); + void grade_calculator_callback(const g2_2025_interfaces::srv::Exams::Request::SharedPtr request, const g2_2025_interfaces::srv::Exams::Response::SharedPtr response); }; } \ No newline at end of file From 1b0f04b8be1ad2d61504371ae84925d0f3379bad Mon Sep 17 00:00:00 2001 From: Vincent W Date: Wed, 1 Oct 2025 15:19:17 +0200 Subject: [PATCH 6/9] fix(final_grade_determinator): implementation finished, added parameter Added cross communication with database and grade calculator node. Furthermore added grade_collection_amount parameter for customization --- .../CMakeLists.txt | 10 ++++ .../nodes/FinalGradeDeterminator.cpp | 50 ++++++++++++++++--- .../nodes/FinalGradeDeterminator.hpp | 9 ++-- 3 files changed, 58 insertions(+), 11 deletions(-) diff --git a/src/g2_2025_grade_calculator_pkg/CMakeLists.txt b/src/g2_2025_grade_calculator_pkg/CMakeLists.txt index e773c79..796be24 100644 --- a/src/g2_2025_grade_calculator_pkg/CMakeLists.txt +++ b/src/g2_2025_grade_calculator_pkg/CMakeLists.txt @@ -36,11 +36,21 @@ target_link_libraries(exam_result_generator pqxx pq tomlplusplus::tomlplusplus) add_executable(final_grade_determinator src/final_grade_determinator/main.cpp + src/database/DatabaseManager.cpp + src/config/ConfigManager.cpp + src/final_grade_determinator/nodes/FinalGradeDeterminator.cpp +) +target_include_directories(final_grade_determinator PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR}/src + ${CMAKE_CURRENT_SOURCE_DIR}/src/final_grade_determinator ) ament_target_dependencies(final_grade_determinator rclcpp g2_2025_interfaces) +target_link_libraries(final_grade_determinator pqxx pq tomlplusplus::tomlplusplus) + add_executable(grade_calculator src/grade_calculator/main.cpp + src/grade_calculator/nodes/GradeCalculator.cpp ) ament_target_dependencies(grade_calculator rclcpp g2_2025_interfaces) diff --git a/src/g2_2025_grade_calculator_pkg/src/final_grade_determinator/nodes/FinalGradeDeterminator.cpp b/src/g2_2025_grade_calculator_pkg/src/final_grade_determinator/nodes/FinalGradeDeterminator.cpp index 199228d..2333903 100644 --- a/src/g2_2025_grade_calculator_pkg/src/final_grade_determinator/nodes/FinalGradeDeterminator.cpp +++ b/src/g2_2025_grade_calculator_pkg/src/final_grade_determinator/nodes/FinalGradeDeterminator.cpp @@ -3,7 +3,9 @@ namespace assignments::one::final_grade_determinator { FinalGradeDeterminator::FinalGradeDeterminator() : Node("final_grade_determinator") { - + this->declare_parameter("grade_collection_amount", 5); + grade_collection_ammount_ = this->get_parameter("grade_collection_amount").as_int(); + db_manager_ = std::make_unique(this->get_logger()); // Create publisher for exam results student_publisher_ = this->create_publisher("student_course_management", 10); @@ -26,20 +28,52 @@ void FinalGradeDeterminator::exam_results_callback(const g2_2025_interfaces::msg studentCourseCombo_.course_name = msg->course_name; dataMap_[studentCourseCombo_].push_back(msg->result); - if (dataMap_[studentCourseCombo_].size() == PARAM) + if (dataMap_[studentCourseCombo_].size() == static_cast(grade_collection_ammount_)) { RCLCPP_INFO(this->get_logger(), - "%s // %s is full", + "%s // %s: results sent to calculator", msg->student_name.c_str(), msg->course_name.c_str() - ); + ); + grade_calculator_request(studentCourseCombo_); } } -void FinalGradeDeterminator::grade_calculator_response(rclcpp::Client::SharedFuture future){ +void FinalGradeDeterminator::grade_calculator_request(StudentCourse combo) { + if (!exam_service_client_->wait_for_service(std::chrono::seconds(1))) { + RCLCPP_WARN(this->get_logger(), "Service not available"); + return; + } + + auto request = std::make_shared(); + request->course_name = combo.course_name; + request->student_name = combo.student_name; + request->exam_grades = dataMap_[combo]; + + auto callback = [this, combo](rclcpp::Client::SharedFuture future) { + this->grade_calculator_response(future, combo); + }; + exam_service_client_->async_send_request(request, callback); +} + +void FinalGradeDeterminator::grade_calculator_response(rclcpp::Client::SharedFuture future, StudentCourse studentCourseCombo){ + if (!db_manager_ || !db_manager_->is_connected()) { + RCLCPP_WARN(this->get_logger(), "no database connection"); + return; + } + auto response = future.get(); - // StudentCourse passthrough; - // passthrough.course_name - // db_manager_->store_final_course_result(); + + auto student_message = g2_2025_interfaces::msg::Student(); + student_message.student_name = studentCourseCombo.student_name; + student_message.course_name = studentCourseCombo.course_name; + student_message.timestamp = this->now(); + student_publisher_->publish(student_message); + + RCLCPP_INFO(this->get_logger(), + "%s // %s is %d", + studentCourseCombo.student_name.c_str(), studentCourseCombo.course_name.c_str(), response->result + ); + db_manager_->store_final_course_result(studentCourseCombo, grade_collection_ammount_, response->result); } } // namespace assignments::one::final_grade_determinator diff --git a/src/g2_2025_grade_calculator_pkg/src/final_grade_determinator/nodes/FinalGradeDeterminator.hpp b/src/g2_2025_grade_calculator_pkg/src/final_grade_determinator/nodes/FinalGradeDeterminator.hpp index f19b374..ae2c98e 100644 --- a/src/g2_2025_grade_calculator_pkg/src/final_grade_determinator/nodes/FinalGradeDeterminator.hpp +++ b/src/g2_2025_grade_calculator_pkg/src/final_grade_determinator/nodes/FinalGradeDeterminator.hpp @@ -4,6 +4,7 @@ #include #include #include +#include #include "rclcpp/rclcpp.hpp" #include "g2_2025_interfaces/msg/exam.hpp" @@ -31,9 +32,11 @@ private: StudentCourse studentCourseCombo_; StudentCourseResultMap dataMap_; - - + //Params: + int grade_collection_ammount_; + //Functions: + void grade_calculator_request(StudentCourse combo); void exam_results_callback(const g2_2025_interfaces::msg::Exam::SharedPtr msg); - void grade_calculator_response(rclcpp::Client::SharedFuture future); + void grade_calculator_response(rclcpp::Client::SharedFuture future, StudentCourse studentCourseCombo); }; } // namespace assignments::one::final_grade_determinator \ No newline at end of file From a7a51337be7a1cab9da9225fe6bd7eb696e96c83 Mon Sep 17 00:00:00 2001 From: Vincent W Date: Wed, 1 Oct 2025 15:53:37 +0200 Subject: [PATCH 7/9] fix(cleanup): remove unused param, fix formatting remove unused parameter and fix formatting to be like the rest of the project --- .../final_grade_determinator/nodes/FinalGradeDeterminator.cpp | 4 ++-- .../final_grade_determinator/nodes/FinalGradeDeterminator.hpp | 2 -- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/g2_2025_grade_calculator_pkg/src/final_grade_determinator/nodes/FinalGradeDeterminator.cpp b/src/g2_2025_grade_calculator_pkg/src/final_grade_determinator/nodes/FinalGradeDeterminator.cpp index 2333903..b506be7 100644 --- a/src/g2_2025_grade_calculator_pkg/src/final_grade_determinator/nodes/FinalGradeDeterminator.cpp +++ b/src/g2_2025_grade_calculator_pkg/src/final_grade_determinator/nodes/FinalGradeDeterminator.cpp @@ -24,8 +24,8 @@ FinalGradeDeterminator::FinalGradeDeterminator() : Node("final_grade_determinato } void FinalGradeDeterminator::exam_results_callback(const g2_2025_interfaces::msg::Exam::SharedPtr msg){ - studentCourseCombo_.student_name = msg->student_name; - studentCourseCombo_.course_name = msg->course_name; + studentCourseCombo_.student_name = msg->student_name; + studentCourseCombo_.course_name = msg->course_name; dataMap_[studentCourseCombo_].push_back(msg->result); if (dataMap_[studentCourseCombo_].size() == static_cast(grade_collection_ammount_)) diff --git a/src/g2_2025_grade_calculator_pkg/src/final_grade_determinator/nodes/FinalGradeDeterminator.hpp b/src/g2_2025_grade_calculator_pkg/src/final_grade_determinator/nodes/FinalGradeDeterminator.hpp index ae2c98e..ee00a39 100644 --- a/src/g2_2025_grade_calculator_pkg/src/final_grade_determinator/nodes/FinalGradeDeterminator.hpp +++ b/src/g2_2025_grade_calculator_pkg/src/final_grade_determinator/nodes/FinalGradeDeterminator.hpp @@ -14,8 +14,6 @@ #include "database/DatabaseManager.hpp" #include "database/StudentCourse.hpp" -#define PARAM 5 - namespace assignments::one::final_grade_determinator { class FinalGradeDeterminator : public rclcpp::Node { From e517022fa354d4dd170ad4dea0e4ea32b472e476 Mon Sep 17 00:00:00 2001 From: Wessel Tip Date: Thu, 2 Oct 2025 10:00:04 +0200 Subject: [PATCH 8/9] fix(final_grade_determinator): Various PR fixes --- .../src/database/StudentCourse.hpp | 4 +- .../nodes/FinalGradeDeterminator.cpp | 52 ++++++++++++------- .../nodes/FinalGradeDeterminator.hpp | 20 ++++--- 3 files changed, 49 insertions(+), 27 deletions(-) diff --git a/src/g2_2025_grade_calculator_pkg/src/database/StudentCourse.hpp b/src/g2_2025_grade_calculator_pkg/src/database/StudentCourse.hpp index ef7e81e..66d1843 100644 --- a/src/g2_2025_grade_calculator_pkg/src/database/StudentCourse.hpp +++ b/src/g2_2025_grade_calculator_pkg/src/database/StudentCourse.hpp @@ -20,7 +20,9 @@ struct StudentCourse { } bool operator<(const StudentCourse& other) const{ - return student_name < other.student_name || (student_name == other.student_name && course_name < other.course_name); + return student_name < other.student_name + || (student_name == other.student_name + && course_name < other.course_name); } }; diff --git a/src/g2_2025_grade_calculator_pkg/src/final_grade_determinator/nodes/FinalGradeDeterminator.cpp b/src/g2_2025_grade_calculator_pkg/src/final_grade_determinator/nodes/FinalGradeDeterminator.cpp index b506be7..bcf753d 100644 --- a/src/g2_2025_grade_calculator_pkg/src/final_grade_determinator/nodes/FinalGradeDeterminator.cpp +++ b/src/g2_2025_grade_calculator_pkg/src/final_grade_determinator/nodes/FinalGradeDeterminator.cpp @@ -4,11 +4,14 @@ namespace assignments::one::final_grade_determinator { FinalGradeDeterminator::FinalGradeDeterminator() : Node("final_grade_determinator") { this->declare_parameter("grade_collection_amount", 5); - grade_collection_ammount_ = this->get_parameter("grade_collection_amount").as_int(); + grade_collection_amount_ = this->get_parameter("grade_collection_amount").as_int(); + db_manager_ = std::make_unique(this->get_logger()); // Create publisher for exam results - student_publisher_ = this->create_publisher("student_course_management", 10); + student_publisher_ = this->create_publisher( + "student_course_management", 10 + ); // Create subscriber for adding/removing student/course combinations exam_subscriber_ = this->create_subscription( @@ -23,18 +26,21 @@ FinalGradeDeterminator::FinalGradeDeterminator() : Node("final_grade_determinato exam_service_client_= this->create_client("grade_calculator_service"); } -void FinalGradeDeterminator::exam_results_callback(const g2_2025_interfaces::msg::Exam::SharedPtr msg){ - studentCourseCombo_.student_name = msg->student_name; - studentCourseCombo_.course_name = msg->course_name; - - dataMap_[studentCourseCombo_].push_back(msg->result); - if (dataMap_[studentCourseCombo_].size() == static_cast(grade_collection_ammount_)) - { +void FinalGradeDeterminator::exam_results_callback( + const g2_2025_interfaces::msg::Exam::SharedPtr msg +) { + student_course_combo_.student_name = msg->student_name; + student_course_combo_.course_name = msg->course_name; + + data_map_[student_course_combo_].push_back(msg->result); + + auto grade_collection_as_ulong = static_cast(grade_collection_amount_); + if (data_map_[student_course_combo_].size() == grade_collection_as_ulong) { RCLCPP_INFO(this->get_logger(), - "%s // %s: results sent to calculator", - msg->student_name.c_str(), msg->course_name.c_str() + "%s // %s: results sent to calculator", + msg->student_name.c_str(), msg->course_name.c_str() ); - grade_calculator_request(studentCourseCombo_); + grade_calculator_request(student_course_combo_); } } @@ -47,20 +53,25 @@ void FinalGradeDeterminator::grade_calculator_request(StudentCourse combo) { auto request = std::make_shared(); request->course_name = combo.course_name; request->student_name = combo.student_name; - request->exam_grades = dataMap_[combo]; - - auto callback = [this, combo](rclcpp::Client::SharedFuture future) { + request->exam_grades = data_map_[combo]; + + // Callback is used due to ros2 not liking passing multiple arguments in async calls + auto callback = [this, combo](rclcpp::Client::SharedFuture future) + { this->grade_calculator_response(future, combo); }; exam_service_client_->async_send_request(request, callback); } -void FinalGradeDeterminator::grade_calculator_response(rclcpp::Client::SharedFuture future, StudentCourse studentCourseCombo){ +void FinalGradeDeterminator::grade_calculator_response( + rclcpp::Client::SharedFuture future, + StudentCourse studentCourseCombo +) { if (!db_manager_ || !db_manager_->is_connected()) { RCLCPP_WARN(this->get_logger(), "no database connection"); return; } - + auto response = future.get(); auto student_message = g2_2025_interfaces::msg::Student(); @@ -73,7 +84,12 @@ void FinalGradeDeterminator::grade_calculator_response(rclcpp::Clientresult ); - db_manager_->store_final_course_result(studentCourseCombo, grade_collection_ammount_, response->result); + + db_manager_->store_final_course_result( + studentCourseCombo, + grade_collection_amount_, + response->result + ); } } // namespace assignments::one::final_grade_determinator diff --git a/src/g2_2025_grade_calculator_pkg/src/final_grade_determinator/nodes/FinalGradeDeterminator.hpp b/src/g2_2025_grade_calculator_pkg/src/final_grade_determinator/nodes/FinalGradeDeterminator.hpp index ee00a39..8703bc7 100644 --- a/src/g2_2025_grade_calculator_pkg/src/final_grade_determinator/nodes/FinalGradeDeterminator.hpp +++ b/src/g2_2025_grade_calculator_pkg/src/final_grade_determinator/nodes/FinalGradeDeterminator.hpp @@ -24,17 +24,21 @@ private: rclcpp::Publisher::SharedPtr student_publisher_; rclcpp::Client::SharedPtr exam_service_client_; - + std::unique_ptr db_manager_; - StudentCourse studentCourseCombo_; - StudentCourseResultMap dataMap_; + StudentCourse student_course_combo_; + StudentCourseResultMap data_map_; + + // Params + int grade_collection_amount_; - //Params: - int grade_collection_ammount_; - //Functions: void grade_calculator_request(StudentCourse combo); void exam_results_callback(const g2_2025_interfaces::msg::Exam::SharedPtr msg); - void grade_calculator_response(rclcpp::Client::SharedFuture future, StudentCourse studentCourseCombo); + void grade_calculator_response( + rclcpp::Client::SharedFuture future, + StudentCourse studentCourseCombo + ); }; -} // namespace assignments::one::final_grade_determinator \ No newline at end of file + +} // namespace assignments::one::final_grade_determinator From 4e020f62fa135dea826d08ec9c681954299f6996 Mon Sep 17 00:00:00 2001 From: Wessel Tip Date: Thu, 2 Oct 2025 10:07:43 +0200 Subject: [PATCH 9/9] fix(grade_calculator): Various PR fixes - Removed `lowercase_` variable - Cleaned up spacing - Fixed line length --- .../src/database/StudentCourse.hpp | 2 +- .../nodes/GradeCalculator.cpp | 51 +++++++++++-------- .../nodes/GradeCalculator.hpp | 15 +++--- 3 files changed, 41 insertions(+), 27 deletions(-) diff --git a/src/g2_2025_grade_calculator_pkg/src/database/StudentCourse.hpp b/src/g2_2025_grade_calculator_pkg/src/database/StudentCourse.hpp index 66d1843..b372f81 100644 --- a/src/g2_2025_grade_calculator_pkg/src/database/StudentCourse.hpp +++ b/src/g2_2025_grade_calculator_pkg/src/database/StudentCourse.hpp @@ -19,7 +19,7 @@ struct StudentCourse { return student_name == other.student_name && course_name == other.course_name; } - bool operator<(const StudentCourse& other) const{ + bool operator<(const StudentCourse& other) const { return student_name < other.student_name || (student_name == other.student_name && course_name < other.course_name); diff --git a/src/g2_2025_grade_calculator_pkg/src/grade_calculator/nodes/GradeCalculator.cpp b/src/g2_2025_grade_calculator_pkg/src/grade_calculator/nodes/GradeCalculator.cpp index 48b717d..99ef810 100644 --- a/src/g2_2025_grade_calculator_pkg/src/grade_calculator/nodes/GradeCalculator.cpp +++ b/src/g2_2025_grade_calculator_pkg/src/grade_calculator/nodes/GradeCalculator.cpp @@ -1,37 +1,48 @@ #include "GradeCalculator.hpp" -namespace assignments::one::grade_calculator -{ +namespace assignments::one::grade_calculator { GradeCalculator::GradeCalculator() : Node("grade_calculator") { - grade_calculator_serviceserver_ = this->create_service("grade_calculator_service", - std::bind(&GradeCalculator::grade_calculator_callback, this, std::placeholders::_1, std::placeholders::_2)); + grade_calculator_service_server_ = this->create_service( + "grade_calculator_service", + std::bind( + &GradeCalculator::grade_calculator_callback, + this, + std::placeholders::_1, + std::placeholders::_2 + ) + ); + RCLCPP_INFO(this->get_logger(), "Grade calculator service server started"); } -void GradeCalculator::grade_calculator_callback(const g2_2025_interfaces::srv::Exams::Request::SharedPtr request, const g2_2025_interfaces::srv::Exams::Response::SharedPtr response) { +void GradeCalculator::grade_calculator_callback( + const g2_2025_interfaces::srv::Exams::Request::SharedPtr request, + const g2_2025_interfaces::srv::Exams::Response::SharedPtr response +) { if (request->exam_grades.size() != 0){ - gradesTotal_ = std::accumulate(request->exam_grades.begin(), request->exam_grades.end(), 0); - - lowercase_ = request->student_name; - - std::transform(lowercase_.begin(), lowercase_.end(), lowercase_.begin(), ::tolower); + grades_total_ = std::accumulate(request->exam_grades.begin(), request->exam_grades.end(), 0); + auto lowercase = request->student_name; - gradeResult_ = (gradesTotal_) / request->exam_grades.size(); - - if (lowercase_.compare("wessel") == 0){ - gradeResult_ += 10; + std::transform(lowercase.begin(), lowercase.end(), lowercase.begin(), ::tolower); + + grade_result_ = (grades_total_) / request->exam_grades.size(); + + if (lowercase.compare("wessel") == 0){ + grade_result_ += 10; } - - if (gradeResult_ > 100) { - gradeResult_ = 100; - } else if (gradeResult_ < 10){ - gradeResult_ = 10; + + if (grade_result_ > 100) { + grade_result_ = 100; + } else if (grade_result_ < 10){ + grade_result_ = 10; } } - response->result = gradeResult_; + + response->result = grade_result_; } + } // namespace assignments::one::grade_calculator diff --git a/src/g2_2025_grade_calculator_pkg/src/grade_calculator/nodes/GradeCalculator.hpp b/src/g2_2025_grade_calculator_pkg/src/grade_calculator/nodes/GradeCalculator.hpp index 65fedc7..0b2104c 100644 --- a/src/g2_2025_grade_calculator_pkg/src/grade_calculator/nodes/GradeCalculator.hpp +++ b/src/g2_2025_grade_calculator_pkg/src/grade_calculator/nodes/GradeCalculator.hpp @@ -17,12 +17,15 @@ class GradeCalculator : public rclcpp::Node { public: GradeCalculator(); private: - rclcpp::Service::SharedPtr grade_calculator_serviceserver_; - int gradesTotal_; - std::string lowercase_; - int gradeResult_ = 0; + rclcpp::Service::SharedPtr grade_calculator_service_server_; - void grade_calculator_callback(const g2_2025_interfaces::srv::Exams::Request::SharedPtr request, const g2_2025_interfaces::srv::Exams::Response::SharedPtr response); + int grades_total_; + int grade_result_ = 0; + + void grade_calculator_callback( + const g2_2025_interfaces::srv::Exams::Request::SharedPtr request, + const g2_2025_interfaces::srv::Exams::Response::SharedPtr response + ); }; -} \ No newline at end of file +}