Skip to content

Commit 076736d

Browse files
committed
update ros2 coe generator to create the ROS package complete
1 parent 7303e83 commit 076736d

1 file changed

Lines changed: 94 additions & 7 deletions

File tree

plugins/de.fraunhofer.ipa.roscode.generator/src/de/fraunhofer/ipa/roscode/generator/Ros2CodeGenerator.xtend

Lines changed: 94 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,31 +8,104 @@ import org.eclipse.xtext.generator.IOutputConfigurationProvider
88
import org.eclipse.xtext.generator.OutputConfiguration
99
import java.util.Set
1010
import 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
*/
1920
class 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+
projectpkg.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_packagedepend_pkg» REQUIRED)
94+
«ENDFOR»
95+
96+
«FOR art:pkg.artifact»
97+
add_executableart.name» srcart.node.name».cpp)
98+
ament_target_dependenciesart.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

Comments
 (0)