@@ -8,31 +8,104 @@ import org.eclipse.xtext.generator.IOutputConfigurationProvider
88import org.eclipse.xtext.generator.OutputConfiguration
99import java.util.Set
1010import ros.*
11-
12-
11+ import java.util.List
12+ import java.util.ArrayList
13+ import java.util.HashSet
1314
1415/**
1516 * Generates code from your model files on save.
1617 *
1718 * See https://www.eclipse.org/Xtext/documentation/303_runtime_concepts.html#code-generation
1819 */
1920class Ros2CodeGenerator extends AbstractGenerator {
20-
2121
2222 String resourcepath
2323 String import_msgs
2424 int char_i
25+ Node node
26+ List<String > PkgsList
27+ Set<String > set
28+
2529
2630 override void doGenerate (Resource resource , IFileSystemAccess2 fsa , IGeneratorContext context ) {
2731 resourcepath = resource. URI . toString();
2832 if (! resourcepath. contains(" /ros-input" )) {
29- for (node : resource. allContents. toIterable. filter(Node )){
30- fsa. generateFile(node. getName()+ " .cpp" ,node. compile)
33+ for (pkg : resource. allContents. toIterable. filter(Package )){
34+ fsa. generateFile(pkg. getName(). toLowerCase+ " /package.xml" ,pkg. compile_package_xml)
35+ fsa. generateFile(pkg. getName(). toLowerCase+ " /CMakeLists.txt" ,pkg. compile_CMakeLists)
36+ for (art : pkg. artifact){
37+ node = art. node
38+ fsa. generateFile(pkg. getName(). toLowerCase+ " /src/" + node. name+ " .cpp" ,node. compile_node)
39+
40+ }
41+ }
3142 }
3243 }
33- }
3444
35- def compile (Node node ) '''
45+
46+ def compile_package_xml (Package pkg )'''
47+ <?xml version="1.0"?>
48+ <?xml-model
49+ href="http://download.ros.org/schema/package_format3.xsd"
50+ schematypens="http://www.w3.org/2001/XMLSchema"?>
51+ <package format="3">
52+ <name>«pkg.name»</name>
53+ <version>0.0.0</version>
54+ <description>This package contains the implementation of the node «pkg.artifact.get (0 ).node.name»</description>
55+ <maintainer email="jane.doe@example.com">Jane Doe</maintainer>
56+ <author email="jane.doe@example.com">Jane Doe</author>
57+ <license>Apache 2.0</license>
58+
59+ <buildtool_depend>ament_cmake</buildtool_depend>
60+
61+ <depend>boost</depend>
62+ <depend>rclcpp</depend>
63+ «FOR depend_pkg:pkg.getPkgDependencies»
64+ <depend>«depend_pkg»</depend>
65+ «ENDFOR»
66+
67+ <test_depend>ament_lint_auto</test_depend>
68+ <test_depend>ament_lint_common</test_depend>
69+
70+ <export>
71+ <build_type>ament_cmake</build_type>
72+ </export>
73+ </package >
74+ '''
75+
76+ def compile_CMakeLists (Package pkg )'''
77+ cmake_minimum_required (VERSION 3 .5 )
78+ project («pkg .name »)
79+
80+ # Default to C++14
81+ if (NOT CMAKE_CXX_STANDARD )
82+ set (CMAKE_CXX_STANDARD 14 )
83+ endif ()
84+
85+ if (CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang ")
86+ add_compile_options (-Wall -Wextra -Wpedantic )
87+ endif ()
88+
89+ find_package (ament_cmake REQUIRED )
90+ find_package (Boost REQUIRED )
91+ find_package (rclcpp REQUIRED )
92+ «FOR depend_pkg:pkg.getPkgDependencies»
93+ find_package («depend_pkg » REQUIRED )
94+ «ENDFOR»
95+
96+ «FOR art:pkg.artifact»
97+ add_executable («art .name » src /«art .node .name ».cpp )
98+ ament_target_dependencies («art .name » «FOR depend_pkg :pkg .getPkgDependencies »«depend_pkg » «ENDFOR »)
99+
100+ install (TARGETS
101+ «art .name »
102+ DESTINATION lib /${PROJECT_NAME })
103+ «ENDFOR»
104+
105+ ament_package ()
106+ '''
107+
108+ def compile_node (Node node ) '''
36109#include <chrono>
37110#include <cstdio>
38111#include <memory>
@@ -149,6 +222,20 @@ int main(int argc, char * argv[])
149222}
150223 ' ' '
151224
225+ def List<String> getPkgDependencies(Package pkg){
226+ set=new HashSet<String>()
227+ PkgsList = new ArrayList()
228+ for (art:pkg.artifact){
229+ node=art.node
230+ for (pub:node.publisher){set.add(pub.message.package.name)}
231+ for (sub:node.subscriber){set.add(sub.message.package.name)}
232+ for (srvserver:node.serviceserver){set.add(srvserver.service.package.name)}
233+ for (srvclient:node.serviceclient){set.add(srvclient.service.package.name)}
234+ }
235+ PkgsList.addAll(set)
236+ return PkgsList
237+ }
238+
152239 def String check_message_include(String message_name){
153240 import_msgs = message_name.toFirstLower;
154241 for (char_i =0; char_i < import_msgs.length; char_i++ ){
0 commit comments