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