From f5adbb59a46f4faa884990d5769cc2ed32bcd459 Mon Sep 17 00:00:00 2001 From: James Pace Date: Sun, 26 Jul 2026 07:28:20 -0400 Subject: [PATCH] Pull it together. --- CMakeLists.txt | 4 +- include/j7s_diagnostics_ros/conversions.hpp | 22 ++++++--- j7s_diagnostics_cxx/Cargo.lock | 5 +- j7s_diagnostics_cxx/Cargo.toml | 2 +- j7s_diagnostics_cxx/src/lib.rs | 5 ++ src/conversions.cpp | 51 ++++++++++++++----- src/test.cpp | 55 +++++++++++++++++---- 7 files changed, 111 insertions(+), 33 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index bb4a205..8a94b0e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,6 +4,7 @@ project(j7s_diagnostics_ros CXX) find_package(ament_cmake REQUIRED) find_package(rclcpp REQUIRED) find_package(diagnostic_msgs REQUIRED) +find_package(fmt REQUIRED) include(FetchContent) FetchContent_Declare( @@ -38,6 +39,7 @@ target_include_directories(conversions PUBLIC target_link_libraries(conversions PUBLIC j7s_diagnostics_cxx_bridge j7s_diagnostics_cxx + fmt ${diagnostic_msgs_TARGETS} ) @@ -51,7 +53,7 @@ target_link_libraries(test_bin PRIVATE install(TARGETS conversions - #test_bin + test_bin DESTINATION lib/${PROJECT_NAME}) ament_export_targets(export_${PROJECT_NAME}) diff --git a/include/j7s_diagnostics_ros/conversions.hpp b/include/j7s_diagnostics_ros/conversions.hpp index 181305d..e113920 100644 --- a/include/j7s_diagnostics_ros/conversions.hpp +++ b/include/j7s_diagnostics_ros/conversions.hpp @@ -1,20 +1,28 @@ #pragma once -#include "j7s_diagnostics_cxx_bridge/lib.h" #include #include +#include "j7s_diagnostics_cxx_bridge/lib.h" -std::string convertString(const rust::String& rust); +std::string convertString(const rust::String & rust); j7s_diagnostics_cxx::DiagnosticLevel convertLevel(const uint8_t rosLevel); -uint8_t convertLevel(const j7s_diagnostics_cxx::DiagnosticLevel& level ); +uint8_t convertLevel(const j7s_diagnostics_cxx::DiagnosticLevel & level); -std::vector convertValues(const rust::Box& map); +std::vector convertValues( + const rust::Box & map); -rust::Box convertValues(const std::vector& map); +rust::Box convertValues( + const std::vector & map); -j7s_diagnostics_cxx::DiagnosticStatus fromMsg(const diagnostic_msgs::msg::DiagnosticStatus& msg); +j7s_diagnostics_cxx::DiagnosticStatus fromMsg(const diagnostic_msgs::msg::DiagnosticStatus & msg); -diagnostic_msgs::msg::DiagnosticStatus toMsg(const j7s_diagnostics_cxx::DiagnosticStatus& status); +diagnostic_msgs::msg::DiagnosticStatus toMsg(const j7s_diagnostics_cxx::DiagnosticStatus & status); + +rust::Vec fromMsg( + const diagnostic_msgs::msg::DiagnosticArray & msg); + +diagnostic_msgs::msg::DiagnosticArray toMsg( + const rust::Vec & statuses); diff --git a/j7s_diagnostics_cxx/Cargo.lock b/j7s_diagnostics_cxx/Cargo.lock index 6ea0fb1..9e23c64 100644 --- a/j7s_diagnostics_cxx/Cargo.lock +++ b/j7s_diagnostics_cxx/Cargo.lock @@ -16,9 +16,9 @@ checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470" [[package]] name = "cc" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c89588d05638b5b4594a3348a2d6c20277e43a7f5c5202b05cc56888475a47b8" +checksum = "5add81bb678e6cb321aff7fa0dc7689ad82b112dbc032cea19f91d6b8e3582b9" dependencies = [ "find-msvc-tools", "shlex", @@ -160,7 +160,6 @@ dependencies = [ [[package]] name = "j7s_diagnostics" version = "0.1.0" -source = "git+https://git.jpace121.net/public/j7s_diagnostics.git?branch=main#5f5e9c3b8aa82fd6d14f7a7931604a225fd6b551" dependencies = [ "limbo_graph", "thiserror", diff --git a/j7s_diagnostics_cxx/Cargo.toml b/j7s_diagnostics_cxx/Cargo.toml index f23011b..010ff98 100644 --- a/j7s_diagnostics_cxx/Cargo.toml +++ b/j7s_diagnostics_cxx/Cargo.toml @@ -9,7 +9,7 @@ crate-type = ["staticlib"] [dependencies] anyhow = "1.0.103" cxx = "1.0" -j7s_diagnostics = { branch = "main", git="https://git.jpace121.net/public/j7s_diagnostics.git" } +j7s_diagnostics = { path="../../j7s_diagnostics/" } [build-dependencies] cxx-build = "1.0" diff --git a/j7s_diagnostics_cxx/src/lib.rs b/j7s_diagnostics_cxx/src/lib.rs index c8e6ca4..89d5fc2 100644 --- a/j7s_diagnostics_cxx/src/lib.rs +++ b/j7s_diagnostics_cxx/src/lib.rs @@ -50,6 +50,7 @@ mod ffi { #[Self = "DiagnosticTree"] fn build() -> Box; fn add_statuses(self: &mut DiagnosticTree, statuses: &Vec) -> Result<()>; + fn add_status(self: &mut DiagnosticTree, status: &DiagnosticStatus) -> Result<()>; fn reconcile(self: &mut DiagnosticTree) -> Result<()>; fn aggregate(self: &DiagnosticTree) -> Result>; @@ -138,6 +139,10 @@ impl DiagnosticTree { Ok(self.graph.add_status_vec(&converted_statuses)?) } + fn add_status(self: &mut DiagnosticTree, status: &crate::ffi::DiagnosticStatus) -> anyhow::Result<()> { + Ok(self.graph.add_status(diagnostic_status_to_rust(&status))?) + } + pub fn reconcile(self: &mut DiagnosticTree) -> anyhow::Result<()> { Ok(self.graph.reconcile_levels()?) } diff --git a/src/conversions.cpp b/src/conversions.cpp index 123c3af..92211f1 100644 --- a/src/conversions.cpp +++ b/src/conversions.cpp @@ -1,6 +1,6 @@ #include -std::string convertString(const rust::String& rust) +std::string convertString(const rust::String & rust) { auto copy = rust; return std::string(copy.c_str()); @@ -8,7 +8,7 @@ std::string convertString(const rust::String& rust) j7s_diagnostics_cxx::DiagnosticLevel convertLevel(const uint8_t rosLevel) { - switch(rosLevel) + switch (rosLevel) { case diagnostic_msgs::msg::DiagnosticStatus::OK: return j7s_diagnostics_cxx::DiagnosticLevel::OK; @@ -22,9 +22,9 @@ j7s_diagnostics_cxx::DiagnosticLevel convertLevel(const uint8_t rosLevel) } } -uint8_t convertLevel(const j7s_diagnostics_cxx::DiagnosticLevel& level ) +uint8_t convertLevel(const j7s_diagnostics_cxx::DiagnosticLevel & level) { - switch(level) + switch (level) { case j7s_diagnostics_cxx::DiagnosticLevel::OK: return diagnostic_msgs::msg::DiagnosticStatus::OK; @@ -39,17 +39,18 @@ uint8_t convertLevel(const j7s_diagnostics_cxx::DiagnosticLevel& level ) } } -std::vector convertValues(const rust::Box& map) +std::vector convertValues( + const rust::Box & map) { std::vector toReturn; const rust::Vec keys = map->keys(); - if(keys.empty()) + if (keys.empty()) { return toReturn; } - for(const auto& key : keys) + for (const auto & key : keys) { const auto value = map->get(key); diagnostic_msgs::msg::KeyValue msg; @@ -59,14 +60,14 @@ std::vector convertValues(const rust::Box convertValues(const std::vector& map) +rust::Box convertValues( + const std::vector & map) { rust::Box toReturn = j7s_diagnostics_cxx::StringMap::build(); - for(const auto& pair: map) + for (const auto & pair : map) { toReturn->insert(rust::String(pair.key), rust::String(pair.value)); } @@ -74,7 +75,7 @@ rust::Box convertValues(const std::vector fromMsg( + const diagnostic_msgs::msg::DiagnosticArray & msg) +{ + rust::Vec toReturn; + toReturn.reserve(msg.status.size()); + + for (const auto & rosMsg : msg.status) + { + toReturn.emplace_back(fromMsg(rosMsg)); + } + return toReturn; +} + +diagnostic_msgs::msg::DiagnosticStatus toMsg(const j7s_diagnostics_cxx::DiagnosticStatus & status) { diagnostic_msgs::msg::DiagnosticStatus toReturn; toReturn.level = convertLevel(status.level); @@ -97,3 +111,16 @@ diagnostic_msgs::msg::DiagnosticStatus toMsg(const j7s_diagnostics_cxx::Diagnost return toReturn; } + +diagnostic_msgs::msg::DiagnosticArray toMsg( + const rust::Vec & statuses) +{ + diagnostic_msgs::msg::DiagnosticArray msg; + msg.status.reserve(statuses.size()); + + for (const auto & status : statuses) + { + msg.status.emplace_back(toMsg(status)); + } + return msg; +} diff --git a/src/test.cpp b/src/test.cpp index 9dab5dd..f9f0184 100644 --- a/src/test.cpp +++ b/src/test.cpp @@ -1,17 +1,54 @@ +#include + #include #include -int main(int argc, char *argv[]) +diagnostic_msgs::msg::DiagnosticStatus make_test_status(const std::string & name, uint8_t level) { - const auto my_string = j7s_diagnostics_cxx::OptionalString::some(rust::String("test")); - if(my_string->is_some()) - { - auto as_string = my_string->value(); - std::cout << as_string.c_str() << std::endl; - } + diagnostic_msgs::msg::DiagnosticStatus status; + status.name = name; + status.level = level; - auto my_map = j7s_diagnostics_cxx::StringMap::build(); - my_map->insert(rust::String("a"), rust::String("b")); + return status; +} + +std::string levelToString(uint8_t level) +{ + switch (level) + { + case diagnostic_msgs::msg::DiagnosticStatus::OK: + return "OK"; + case diagnostic_msgs::msg::DiagnosticStatus::WARN: + return "WARN"; + case diagnostic_msgs::msg::DiagnosticStatus::ERROR: + return "ERROR"; + case diagnostic_msgs::msg::DiagnosticStatus::STALE: + return "STALE"; + default: + return "N/A"; + } +} + +int main(int argc, char * argv[]) +{ + diagnostic_msgs::msg::DiagnosticArray diagArray; + diagArray.status.emplace_back( + make_test_status("a", diagnostic_msgs::msg::DiagnosticStatus::OK)); + diagArray.status.emplace_back( + make_test_status("a/b", diagnostic_msgs::msg::DiagnosticStatus::WARN)); + diagArray.status.emplace_back( + make_test_status("a/c", diagnostic_msgs::msg::DiagnosticStatus::OK)); + diagArray.status.emplace_back( + make_test_status("a/c/d", diagnostic_msgs::msg::DiagnosticStatus::OK)); + + auto tree = j7s_diagnostics_cxx::DiagnosticTree::build(); + tree->add_statuses(fromMsg(diagArray)); + tree->reconcile(); + const auto aggregate = toMsg(tree->aggregate()); + for (const auto & status : aggregate.status) + { + fmt::println("Name: {} Level: {}", status.name, levelToString(status.level)); + } return 0; }