Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix service and action interface generation #76

Merged
merged 7 commits into from
Mar 18, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions rosidl_generator_java/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ if(BUILD_TESTING)
set(_deps_library_dirs "")
list_append_unique(_deps_library_dirs ${CMAKE_CURRENT_BINARY_DIR})
list_append_unique(_deps_library_dirs ${CMAKE_CURRENT_BINARY_DIR}/rosidl_generator_java/rosidl_generator_java/msg/)
list_append_unique(_deps_library_dirs ${CMAKE_CURRENT_BINARY_DIR}/rosidl_generator_java/rosidl_generator_java/srv/)

foreach(testsuite ${${PROJECT_NAME}_testsuites})
ament_add_junit_tests("${PROJECT_NAME}_tests_${testsuite}"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,10 @@ foreach(_abs_idl_file ${rosidl_generate_interfaces_ABS_IDL_FILES})
"${_output_path}/${_parent_folder}/${_idl_name}_Request.java"
"${_output_path}/${_parent_folder}/${_idl_name}_Response.java"
)
foreach(_typesupport_impl ${_typesupport_impls})
list(APPEND _generated_extension_${_typesupport_impl}_files "${_output_path}/${_parent_folder}/${_idl_name}_Request.ep.${_typesupport_impl}.cpp")
list(APPEND _generated_extension_${_typesupport_impl}_files "${_output_path}/${_parent_folder}/${_idl_name}_Response.ep.${_typesupport_impl}.cpp")
endforeach()
endif()
# Actions generate extra files
if(_parent_folder STREQUAL "action")
Expand All @@ -78,6 +82,11 @@ foreach(_abs_idl_file ${rosidl_generate_interfaces_ABS_IDL_FILES})
"${_output_path}/${_parent_folder}/${_idl_name}_Result.java"
"${_output_path}/${_parent_folder}/${_idl_name}_Feedback.java"
)
foreach(_typesupport_impl ${_typesupport_impls})
list(APPEND _generated_extension_${_typesupport_impl}_files "${_output_path}/${_parent_folder}/${_idl_name}_Goal.ep.${_typesupport_impl}.cpp")
list(APPEND _generated_extension_${_typesupport_impl}_files "${_output_path}/${_parent_folder}/${_idl_name}_Result.ep.${_typesupport_impl}.cpp")
list(APPEND _generated_extension_${_typesupport_impl}_files "${_output_path}/${_parent_folder}/${_idl_name}_Feedback.ep.${_typesupport_impl}.cpp")
endforeach()
endif()

foreach(_typesupport_impl ${_typesupport_impls})
Expand Down
94 changes: 82 additions & 12 deletions rosidl_generator_java/resource/action.cpp.em
Original file line number Diff line number Diff line change
@@ -1,23 +1,93 @@
@# Included from rosidl_generator_java/resource/idl.cpp.em
@{
import os

from rosidl_cmake import expand_template
from rosidl_generator_c import idl_structure_type_to_c_include_prefix

action_includes = [
'rosidl_generator_c/action_type_support_struct.h',
]
namespaces = action.namespaced_type.namespaces
type_name = action.namespaced_type.name
goal_type_name = action.goal.structure.namespaced_type.name
result_type_name = action.result.structure.namespaced_type.name
feedback_type_name = action.feedback.structure.namespaced_type.name
feedback_message_type_name = action.feedback_message.structure.namespaced_type.name
send_goal_type_name = action.send_goal_service.namespaced_type.name
get_result_type_name = action.get_result_service.namespaced_type.name

data = {
'package_name': package_name,
'output_dir': output_dir,
'template_basepath': template_basepath,
}

# Generate Goal message type
data.update({'message': action.goal})
output_file = os.path.join(
output_dir, *namespaces[1:], '{0}.ep.{1}.cpp'.format(goal_type_name, typesupport_impl))
Comment on lines +25 to +26
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just a question; why the ".ep." portion of the filename?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ep originally stood for entry point, so that code could be split between common code and for each typesupport implementation

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If there are suggestions for renaming (or removing it) I'm happy to do so.

expand_template(
'msg.cpp.em',
data,
output_file)

# Generate Result message type
data.update({'message': action.result})
output_file = os.path.join(
output_dir, *namespaces[1:], '{0}.ep.{1}.cpp'.format(result_type_name, typesupport_impl))
expand_template(
'msg.cpp.em',
data,
output_file)

# Generate Feedback message type
data.update({'message': action.feedback})
output_file = os.path.join(
output_dir, *namespaces[1:], '{0}.ep.{1}.cpp'.format(feedback_type_name, typesupport_impl))
expand_template(
'msg.cpp.em',
data,
output_file)

# Generate FeedbackMessage message type
data.update({'message': action.feedback_message})
output_file = os.path.join(
output_dir,
*namespaces[1:],
'{0}.ep.{1}.cpp'.format(feedback_message_type_name, typesupport_impl))
expand_template(
'msg.cpp.em',
data,
output_file)

# Generate SendGoal service type
data.update({'service': action.send_goal_service})
output_file = os.path.join(
output_dir, *namespaces[1:], '{0}.ep.{1}.cpp'.format(send_goal_type_name, typesupport_impl))
expand_template(
'msg.cpp.em',
data,
output_file)

# Generate SendGoal service type
data.update({'service': action.get_result_service})
output_file = os.path.join(
output_dir, *namespaces[1:], '{0}.ep.{1}.cpp'.format(get_result_type_name, typesupport_impl))
expand_template(
'msg.cpp.em',
data,
output_file)
}@
@[for include in action_includes]@
@[ if include in include_directives]@
// already included above
// @
@[ else]@
@{include_directives.add(include)}@
@[ end if]@
#include "@(include)"
@[end for]@

#include <jni.h>

#include <cstdint>

#include "rosidl_generator_c/action_type_support_struct.h"

#include "@(idl_structure_type_to_c_include_prefix(action.namespaced_type)).h"

// Ensure that a jlong is big enough to store raw pointers
static_assert(sizeof(jlong) >= sizeof(std::intptr_t), "jlong must be able to store pointers");

#ifdef __cplusplus
extern "C" {
#endif
Expand Down
140 changes: 64 additions & 76 deletions rosidl_generator_java/resource/idl.cpp.em
Original file line number Diff line number Diff line change
Expand Up @@ -9,102 +9,90 @@
@# - package_name (string)
@# - interface_path (Path relative to the directory named after the package)
@# - content (IdlContent, list of elements, e.g. Messages or Services)
@# - output_dir (Path)
@# - template_basepath (Path)
@# - typesupport_impl (string, the typesupport identifier of the generated code)
@#######################################################################
@{
include_directives = set()
import os

jni_includes = [
'jni.h',
]
include_directives.update(jni_includes)
std_includes = [
'cassert',
'cstdint',
'string',
]
include_directives.update(std_includes)
rosidl_includes = [
'rosidl_generator_c/message_type_support_struct.h',
]
include_directives.update(rosidl_includes)
rcljava_includes = [
'rcljava_common/exceptions.h',
'rcljava_common/signatures.h',
]
include_directives.update(rcljava_includes)
}@
@[for include in jni_includes]@
#include <@(include)>
@[end for]@

@[for include in std_includes]@
#include <@(include)>
@[end for]@

@[for include in rosidl_includes]@
#include "@(include)"
@[end for]@

@[for include in rcljava_includes]@
#include "@(include)"
@[end for]@

// Ensure that a jlong is big enough to store raw pointers
static_assert(sizeof(jlong) >= sizeof(std::intptr_t), "jlong must be able to store pointers");

using rcljava_common::exceptions::rcljava_throw_exception;
from rosidl_cmake import expand_template
from rosidl_parser.definition import Action
from rosidl_parser.definition import Message
from rosidl_parser.definition import Service

@{
jni_package_name = package_name.replace('_', '_1')
}@
@
@#######################################################################
@# Handle messages
@#######################################################################
@{
from rosidl_parser.definition import Message
}@
@[for message in content.get_elements_of_type(Message)]@
@{
TEMPLATE(
'msg.cpp.em',
package_name=package_name,
jni_package_name=jni_package_name,
message=message,
include_directives=include_directives)
data = {
'package_name': package_name,
'output_dir': output_dir,
'template_basepath': template_basepath,
}

for message in content.get_elements_of_type(Message):
data.update({'message': message})
type_name = message.structure.namespaced_type.name
namespaces = message.structure.namespaced_type.namespaces
output_file = os.path.join(
output_dir, *namespaces[1:], '{0}.ep.{1}.cpp'.format(type_name, typesupport_impl))
expand_template(
'msg.cpp.em',
data,
output_file,
template_basepath=template_basepath)
}@
@[end for]@
@
@#######################################################################
@# Handle services
@#######################################################################
@{
from rosidl_parser.definition import Service
}@
@[for service in content.get_elements_of_type(Service)]@
@{
TEMPLATE(
'srv.cpp.em',
package_name=package_name,
jni_package_name=jni_package_name,
service=service,
include_directives=include_directives)
data = {
'package_name': package_name,
'interface_path': interface_path,
'output_dir': output_dir,
'template_basepath': template_basepath,
'typesupport_impl': typesupport_impl,
}

for service in content.get_elements_of_type(Service):
data.update({'service': service})
type_name = service.namespaced_type.name
namespaces = service.namespaced_type.namespaces
output_file = os.path.join(
output_dir, *namespaces[1:], '{0}.ep.{1}.cpp'.format(type_name, typesupport_impl))
expand_template(
'srv.cpp.em',
data,
output_file,
template_basepath=template_basepath)

}@
@[end for]@
@
@#######################################################################
@# Handle actions
@#######################################################################
@{
from rosidl_parser.definition import Action
}@
@[for action in content.get_elements_of_type(Action)]@
@{
TEMPLATE(
'action.cpp.em',
package_name=package_name,
jni_package_name=jni_package_name,
action=action,
include_directives=include_directives)
data = {
'package_name': package_name,
'interface_path': interface_path,
'output_dir': output_dir,
'template_basepath': template_basepath,
'typesupport_impl': typesupport_impl,
}

for action in content.get_elements_of_type(Action):
data.update({'action': action})
type_name = action.namespaced_type.name
namespaces = action.namespaced_type.namespaces
output_file = os.path.join(
output_dir, *namespaces[1:], '{0}.ep.{1}.cpp'.format(type_name, typesupport_impl))
expand_template(
'action.cpp.em',
data,
output_file,
template_basepath=template_basepath)
}@
@[end for]@
Loading