From e6caab009af01001a727a3f4e74dd147aaa14b60 Mon Sep 17 00:00:00 2001 From: schi_ss Date: Thu, 9 Jul 2026 15:17:40 +0200 Subject: [PATCH] added monitor build to cmakelist (ie colcon build builds monitor first and then create ros2 node) --- README.md | 2 +- monitor/build.rs | 2 +- monitor/build_src/config.rs | 6 ++++++ .../build_src/fn_generator/generate_main.rs | 3 ++- monitor/build_src/templates/t_main.rs | 7 ++----- monitor/ros2_config.toml | 3 +++ rtlola_node/CMakeLists.txt | 20 +++++++++++++++++++ 7 files changed, 35 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 8a7894e..83e3c9a 100644 --- a/README.md +++ b/README.md @@ -52,7 +52,7 @@ A comprehensive RTLola tutorial can be found [here](https://rtlola.cispa.de/play Tested using Rust Version 1.87.0 -> If you want to use ``ros2 run rtlola_node rtlola_ros2_monitor`` then call ``colcon build`` within [rtlola_node](rtlola_node) to build a workspace you can source (ie the monitor must be build first). +> If you want to use ``ros2 run rtlola_node rtlola_ros2_monitor`` then call ``colcon build`` within [rtlola_node](rtlola_node) to build a workspace you can source. ## Contributors - Sebastian Schirmer diff --git a/monitor/build.rs b/monitor/build.rs index 5e8c3ae..0861817 100644 --- a/monitor/build.rs +++ b/monitor/build.rs @@ -57,7 +57,7 @@ fn main() { let mut rust_generator = RustFileGenerator::new(ros2_reader, config.Destination.path.clone()); rust_generator.generate_file_inputs(&subscribable_topics, &rtlolaout_service); - rust_generator.generate_file_main(&subscribable_topics, rtlolaout_service.is_some()); + rust_generator.generate_file_main( &config.Specification.location, &subscribable_topics, rtlolaout_service.is_some()); rust_generator.generate_file_ros2handler( &config, &subscribable_topics, diff --git a/monitor/build_src/config.rs b/monitor/build_src/config.rs index e402569..48004c3 100644 --- a/monitor/build_src/config.rs +++ b/monitor/build_src/config.rs @@ -6,6 +6,7 @@ use serde::Deserialize; #[allow(non_snake_case)] #[derive(Debug, Deserialize)] pub struct Config { + pub Specification: Specification, pub GenerateFlag: GenerateFlag, pub LocalSetupScript: LocalSetupScript, pub QoS_Default: QoS, @@ -15,6 +16,11 @@ pub struct Config { pub Destination: Destination, } +#[derive(Debug, Deserialize)] +pub struct Specification { + pub location: String, +} + #[derive(Debug, Deserialize)] pub struct GenerateFlag { pub generate: bool, diff --git a/monitor/build_src/fn_generator/generate_main.rs b/monitor/build_src/fn_generator/generate_main.rs index bf5cee0..be23dfb 100644 --- a/monitor/build_src/fn_generator/generate_main.rs +++ b/monitor/build_src/fn_generator/generate_main.rs @@ -8,7 +8,7 @@ use std::{ }; impl RustFileGenerator { - pub fn generate_file_main(&self, topics: &Vec<(String, String, QoS)>, has_service: bool) { + pub fn generate_file_main(&self, spec_location: &String, topics: &Vec<(String, String, QoS)>, has_service: bool) { // File that is generated let file_location = format!("{}/main.rs", self.dest_path); let file = File::create(&file_location).unwrap(); @@ -35,6 +35,7 @@ impl RustFileGenerator { file_content = file_content.replace("$SERVICEAVAILABLE$", ""); } file_content = file_content.replace("$INPUTMODS$", &pub_mods_content); + file_content = file_content.replace("$SPECLOCATION$", &spec_location); // Write input source codeto file writeln!(&file, "{}", file_content).unwrap(); // Format generated file diff --git a/monitor/build_src/templates/t_main.rs b/monitor/build_src/templates/t_main.rs index c7884aa..7bd5323 100644 --- a/monitor/build_src/templates/t_main.rs +++ b/monitor/build_src/templates/t_main.rs @@ -16,14 +16,11 @@ use crate::{ input::rtloladata::RTLolaData, input::rtloladata::RTLolaDataFactory, ros2_handler::Ros2Handler, }; use rtlola_interpreter::{input::AssociatedFactory, monitor::Incremental, ConfigBuilder, Monitor}; -use std::{env, fs}; +use std::fs; #[tokio::main] async fn main() { - let args: Vec = env::args().collect(); - assert_eq!(args.len(), 2); - // Reads specification - let spec = fs::read_to_string(&args[1]).unwrap(); + let spec = fs::read_to_string("$SPECLOCATION$").unwrap(); // Creates monitor let monitor: Monitor = ConfigBuilder::new() diff --git a/monitor/ros2_config.toml b/monitor/ros2_config.toml index 2e404c3..8f17608 100644 --- a/monitor/ros2_config.toml +++ b/monitor/ros2_config.toml @@ -1,6 +1,9 @@ # SPDX-FileCopyrightText: 2023 German Aerospace Center (DLR) # SPDX-License-Identifier: Apache-2.0 +[Specification] +location = "../specs/test_spec.lola" + # allows to freeze, i.e., disables build.rs [GenerateFlag] generate = true diff --git a/rtlola_node/CMakeLists.txt b/rtlola_node/CMakeLists.txt index e2ea54b..6ec6614 100644 --- a/rtlola_node/CMakeLists.txt +++ b/rtlola_node/CMakeLists.txt @@ -3,6 +3,26 @@ cmake_minimum_required(VERSION 3.5) project(rtlola_node) + +### +# Build the monitor first +### + +execute_process( + COMMAND cargo build + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../monitor + RESULT_VARIABLE CARGO_RESULT +) + +if(NOT CARGO_RESULT EQUAL 0) + message(FATAL_ERROR "cargo build failed") +endif() + + +### +# Wrap the result as a Ros2 Node +### + find_package(ament_cmake REQUIRED) set(MONITOR_EXECUTABLE ${CMAKE_CURRENT_SOURCE_DIR}/../monitor/target/release/rtlola_ros2_monitor)