From 4a5d229fecdb74d87a18322dc16ae5a20cdfef4a Mon Sep 17 00:00:00 2001 From: Jacob Perron Date: Fri, 23 Oct 2020 18:51:34 +0000 Subject: [PATCH 1/7] Add interfaces for action goal, result, and feedback Implementing these interfaces in the code generation template makes it easier to pass around these types in a generic way. Note, the 'final' modifier had to be removed from generated message types in order to extend goal, result, and feedback types in action definitions. Signed-off-by: Jacob Perron --- .../ros2/rcljava/interfaces/ActionDefinition.java | 6 +++++- rosidl_generator_java/resource/action.java.em | 12 ++++++------ rosidl_generator_java/resource/msg.java.em | 2 +- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/rcljava_common/src/main/java/org/ros2/rcljava/interfaces/ActionDefinition.java b/rcljava_common/src/main/java/org/ros2/rcljava/interfaces/ActionDefinition.java index 9681463b..87694fa1 100644 --- a/rcljava_common/src/main/java/org/ros2/rcljava/interfaces/ActionDefinition.java +++ b/rcljava_common/src/main/java/org/ros2/rcljava/interfaces/ActionDefinition.java @@ -15,4 +15,8 @@ package org.ros2.rcljava.interfaces; -public interface ActionDefinition {} +public interface ActionDefinition { + interface ActionGoal {} + interface ActionResult {} + interface ActionFeedback {} +} diff --git a/rosidl_generator_java/resource/action.java.em b/rosidl_generator_java/resource/action.java.em index 5e7ebbe9..19fe9a57 100644 --- a/rosidl_generator_java/resource/action.java.em +++ b/rosidl_generator_java/resource/action.java.em @@ -76,6 +76,12 @@ import @(action_import); public class @(type_name) implements ActionDefinition { + public class Goal extends @(type_name)_Goal implements ActionGoal<@(type_name)> {} + + public class Result extends @(type_name)_Result implements ActionResult<@(type_name)> {} + + public class Feedback extends @(type_name)_Feedback implements ActionFeedback<@(type_name)> {} + private static final Logger logger = LoggerFactory.getLogger(@(type_name).class); static { @@ -88,10 +94,4 @@ public class @(type_name) implements ActionDefinition { } public static native long getActionTypeSupport(); - - public static final Class<@(type_name)_Goal> GoalType = @(type_name)_Goal.class; - - public static final Class<@(type_name)_Result> ResultType = @(type_name)_Result.class; - - public static final Class<@(type_name)_Feedback> FeedbackType = @(type_name)_Feedback.class; } diff --git a/rosidl_generator_java/resource/msg.java.em b/rosidl_generator_java/resource/msg.java.em index c8912488..9dcb2a42 100644 --- a/rosidl_generator_java/resource/msg.java.em +++ b/rosidl_generator_java/resource/msg.java.em @@ -38,7 +38,7 @@ import @('.'.join(member.type.namespaced_name())); @[ end if]@ @[end for]@ -public final class @(type_name) implements MessageDefinition { +public class @(type_name) implements MessageDefinition { private static final Logger logger = LoggerFactory.getLogger(@(type_name).class); From 768b6d470200dad2aa5946a465d941b56dc091d0 Mon Sep 17 00:00:00 2001 From: Jacob Perron Date: Thu, 29 Oct 2020 01:36:58 +0000 Subject: [PATCH 2/7] Add new definitions for action goal response and request Signed-off-by: Jacob Perron --- rcljava_common/CMakeLists.txt | 2 ++ .../rcljava/interfaces/ActionDefinition.java | 5 +++ .../interfaces/GoalRequestDefinition.java | 21 +++++++++++++ .../interfaces/GoalResponseDefinition.java | 21 +++++++++++++ rosidl_generator_java/resource/action.java.em | 31 +++++++++++++++++++ 5 files changed, 80 insertions(+) create mode 100644 rcljava_common/src/main/java/org/ros2/rcljava/interfaces/GoalRequestDefinition.java create mode 100644 rcljava_common/src/main/java/org/ros2/rcljava/interfaces/GoalResponseDefinition.java diff --git a/rcljava_common/CMakeLists.txt b/rcljava_common/CMakeLists.txt index 3bc04fde..46715393 100644 --- a/rcljava_common/CMakeLists.txt +++ b/rcljava_common/CMakeLists.txt @@ -38,6 +38,8 @@ set(${PROJECT_NAME}_java_sources "src/main/java/org/ros2/rcljava/exceptions/RCLReturn.java" "src/main/java/org/ros2/rcljava/interfaces/ActionDefinition.java" "src/main/java/org/ros2/rcljava/interfaces/Disposable.java" + "src/main/java/org/ros2/rcljava/interfaces/GoalRequestDefinition.java" + "src/main/java/org/ros2/rcljava/interfaces/GoalResponseDefinition.java" "src/main/java/org/ros2/rcljava/interfaces/MessageDefinition.java" "src/main/java/org/ros2/rcljava/interfaces/ServiceDefinition.java" ) diff --git a/rcljava_common/src/main/java/org/ros2/rcljava/interfaces/ActionDefinition.java b/rcljava_common/src/main/java/org/ros2/rcljava/interfaces/ActionDefinition.java index 87694fa1..63134367 100644 --- a/rcljava_common/src/main/java/org/ros2/rcljava/interfaces/ActionDefinition.java +++ b/rcljava_common/src/main/java/org/ros2/rcljava/interfaces/ActionDefinition.java @@ -19,4 +19,9 @@ public interface ActionDefinition { interface ActionGoal {} interface ActionResult {} interface ActionFeedback {} + + Class getSendGoalRequestType(); + Class getSendGoalResponseType(); + Class getGetResultRequestType(); + Class getGetResultResponseType(); } diff --git a/rcljava_common/src/main/java/org/ros2/rcljava/interfaces/GoalRequestDefinition.java b/rcljava_common/src/main/java/org/ros2/rcljava/interfaces/GoalRequestDefinition.java new file mode 100644 index 00000000..f7c96111 --- /dev/null +++ b/rcljava_common/src/main/java/org/ros2/rcljava/interfaces/GoalRequestDefinition.java @@ -0,0 +1,21 @@ +/* Copyright 2020 Open Source Robotics Foundation, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.ros2.rcljava.interfaces; + +public interface GoalRequestDefinition extends MessageDefinition { + ActionDefinition.ActionGoal getAbstractGoal(); + // TODO: Add getGoalId(); +} diff --git a/rcljava_common/src/main/java/org/ros2/rcljava/interfaces/GoalResponseDefinition.java b/rcljava_common/src/main/java/org/ros2/rcljava/interfaces/GoalResponseDefinition.java new file mode 100644 index 00000000..22a23979 --- /dev/null +++ b/rcljava_common/src/main/java/org/ros2/rcljava/interfaces/GoalResponseDefinition.java @@ -0,0 +1,21 @@ +/* Copyright 2020 Open Source Robotics Foundation, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.ros2.rcljava.interfaces; + +public interface GoalResponseDefinition extends MessageDefinition { + void accept(boolean accepted); + // TODO: Add setStamp(); +} diff --git a/rosidl_generator_java/resource/action.java.em b/rosidl_generator_java/resource/action.java.em index 19fe9a57..bad47669 100644 --- a/rosidl_generator_java/resource/action.java.em +++ b/rosidl_generator_java/resource/action.java.em @@ -65,6 +65,9 @@ expand_template( action_imports = [ 'org.ros2.rcljava.common.JNIUtils', 'org.ros2.rcljava.interfaces.ActionDefinition', + 'org.ros2.rcljava.interfaces.GoalRequestDefinition', + 'org.ros2.rcljava.interfaces.GoalResponseDefinition', + 'org.ros2.rcljava.interfaces.MessageDefinition', 'org.slf4j.Logger', 'org.slf4j.LoggerFactory', ] @@ -82,6 +85,34 @@ public class @(type_name) implements ActionDefinition { public class Feedback extends @(type_name)_Feedback implements ActionFeedback<@(type_name)> {} + public class SendGoalRequest extends @(type_name)_SendGoal_Request implements GoalRequestDefinition { + public ActionDefinition.ActionGoal getAbstractGoal() { + return (Goal)super.getGoal(); + } + } + + public class SendGoalResponse extends @(type_name)_SendGoal_Response implements GoalResponseDefinition { + public void accept(boolean accepted) { + super.setAccepted(accepted); + } + } + + public Class getSendGoalRequestType() { + return SendGoalRequest.class; + } + + public Class getSendGoalResponseType() { + return SendGoalResponse.class; + } + + public Class getGetResultRequestType() { + return @(type_name)_GetResult_Request.class; + } + + public Class getGetResultResponseType() { + return @(type_name)_GetResult_Response.class; + } + private static final Logger logger = LoggerFactory.getLogger(@(type_name).class); static { From bdecfa7aef77d5013c6b42f91bd354b7d2e50396 Mon Sep 17 00:00:00 2001 From: Jacob Perron Date: Fri, 6 Nov 2020 23:23:52 +0000 Subject: [PATCH 3/7] Add getter for UUID to SendGoalRequest Also make inner classes static. Signed-off-by: Jacob Perron --- .../rcljava/interfaces/GoalRequestDefinition.java | 6 ++++-- rosidl_generator_java/resource/action.java.em | 15 ++++++++------- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/rcljava_common/src/main/java/org/ros2/rcljava/interfaces/GoalRequestDefinition.java b/rcljava_common/src/main/java/org/ros2/rcljava/interfaces/GoalRequestDefinition.java index f7c96111..d70f099e 100644 --- a/rcljava_common/src/main/java/org/ros2/rcljava/interfaces/GoalRequestDefinition.java +++ b/rcljava_common/src/main/java/org/ros2/rcljava/interfaces/GoalRequestDefinition.java @@ -15,7 +15,9 @@ package org.ros2.rcljava.interfaces; +import java.util.List; + public interface GoalRequestDefinition extends MessageDefinition { - ActionDefinition.ActionGoal getAbstractGoal(); - // TODO: Add getGoalId(); + MessageDefinition getGoal(); + List getGoalUuid(); } diff --git a/rosidl_generator_java/resource/action.java.em b/rosidl_generator_java/resource/action.java.em index bad47669..7bb91571 100644 --- a/rosidl_generator_java/resource/action.java.em +++ b/rosidl_generator_java/resource/action.java.em @@ -63,6 +63,7 @@ expand_template( template_basepath=template_basepath) action_imports = [ + 'java.util.List', 'org.ros2.rcljava.common.JNIUtils', 'org.ros2.rcljava.interfaces.ActionDefinition', 'org.ros2.rcljava.interfaces.GoalRequestDefinition', @@ -79,19 +80,19 @@ import @(action_import); public class @(type_name) implements ActionDefinition { - public class Goal extends @(type_name)_Goal implements ActionGoal<@(type_name)> {} + public static class Goal extends @(type_name)_Goal implements ActionGoal<@(type_name)> {} - public class Result extends @(type_name)_Result implements ActionResult<@(type_name)> {} + public static class Result extends @(type_name)_Result implements ActionResult<@(type_name)> {} - public class Feedback extends @(type_name)_Feedback implements ActionFeedback<@(type_name)> {} + public static class Feedback extends @(type_name)_Feedback implements ActionFeedback<@(type_name)> {} - public class SendGoalRequest extends @(type_name)_SendGoal_Request implements GoalRequestDefinition { - public ActionDefinition.ActionGoal getAbstractGoal() { - return (Goal)super.getGoal(); + public static class SendGoalRequest extends @(type_name)_SendGoal_Request implements GoalRequestDefinition { + public List getGoalUuid() { + return super.getGoalId().getUuid(); } } - public class SendGoalResponse extends @(type_name)_SendGoal_Response implements GoalResponseDefinition { + public static class SendGoalResponse extends @(type_name)_SendGoal_Response implements GoalResponseDefinition { public void accept(boolean accepted) { super.setAccepted(accepted); } From 1b65d7fd91a95cd7e112c33d1f4ea8f2312a6bb6 Mon Sep 17 00:00:00 2001 From: Jacob Perron Date: Fri, 13 Nov 2020 09:08:12 -0800 Subject: [PATCH 4/7] Add getStamp method to GoalResponseDefinition Signed-off-by: Jacob Perron --- .../ros2/rcljava/interfaces/GoalResponseDefinition.java | 2 +- rosidl_generator_java/resource/action.java.em | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/rcljava_common/src/main/java/org/ros2/rcljava/interfaces/GoalResponseDefinition.java b/rcljava_common/src/main/java/org/ros2/rcljava/interfaces/GoalResponseDefinition.java index 22a23979..c802c58e 100644 --- a/rcljava_common/src/main/java/org/ros2/rcljava/interfaces/GoalResponseDefinition.java +++ b/rcljava_common/src/main/java/org/ros2/rcljava/interfaces/GoalResponseDefinition.java @@ -17,5 +17,5 @@ public interface GoalResponseDefinition extends MessageDefinition { void accept(boolean accepted); - // TODO: Add setStamp(); + void setStamp(int sec, int nanosec); } diff --git a/rosidl_generator_java/resource/action.java.em b/rosidl_generator_java/resource/action.java.em index 7bb91571..cadb15e3 100644 --- a/rosidl_generator_java/resource/action.java.em +++ b/rosidl_generator_java/resource/action.java.em @@ -96,6 +96,13 @@ public class @(type_name) implements ActionDefinition { public void accept(boolean accepted) { super.setAccepted(accepted); } + + public void setStamp(int sec, int nanosec) { + builtin_interfaces.msg.Time msg = new builtin_interfaces.msg.Time(); + msg.setSec(sec); + msg.setNanosec(nanosec); + super.setStamp(msg); + } } public Class getSendGoalRequestType() { From b725144feda52eadff2e1d8b46d995bab12d0298 Mon Sep 17 00:00:00 2001 From: Jacob Perron Date: Fri, 13 Nov 2020 09:19:07 -0800 Subject: [PATCH 5/7] Partially revert "Add interfaces for action goal, result, and feedback" Partially revert commit dd046147d38c1aa844376149f62c4f3aaec04d96. I don't think we need to aliases for the message types, but I'll add them back if they turn out to be useful. --- .../ros2/rcljava/interfaces/ActionDefinition.java | 4 ---- rosidl_generator_java/resource/action.java.em | 12 ++++++------ 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/rcljava_common/src/main/java/org/ros2/rcljava/interfaces/ActionDefinition.java b/rcljava_common/src/main/java/org/ros2/rcljava/interfaces/ActionDefinition.java index 63134367..e39d65d8 100644 --- a/rcljava_common/src/main/java/org/ros2/rcljava/interfaces/ActionDefinition.java +++ b/rcljava_common/src/main/java/org/ros2/rcljava/interfaces/ActionDefinition.java @@ -16,10 +16,6 @@ package org.ros2.rcljava.interfaces; public interface ActionDefinition { - interface ActionGoal {} - interface ActionResult {} - interface ActionFeedback {} - Class getSendGoalRequestType(); Class getSendGoalResponseType(); Class getGetResultRequestType(); diff --git a/rosidl_generator_java/resource/action.java.em b/rosidl_generator_java/resource/action.java.em index cadb15e3..7b158e0c 100644 --- a/rosidl_generator_java/resource/action.java.em +++ b/rosidl_generator_java/resource/action.java.em @@ -80,12 +80,6 @@ import @(action_import); public class @(type_name) implements ActionDefinition { - public static class Goal extends @(type_name)_Goal implements ActionGoal<@(type_name)> {} - - public static class Result extends @(type_name)_Result implements ActionResult<@(type_name)> {} - - public static class Feedback extends @(type_name)_Feedback implements ActionFeedback<@(type_name)> {} - public static class SendGoalRequest extends @(type_name)_SendGoal_Request implements GoalRequestDefinition { public List getGoalUuid() { return super.getGoalId().getUuid(); @@ -133,4 +127,10 @@ public class @(type_name) implements ActionDefinition { } public static native long getActionTypeSupport(); + + public static final Class<@(type_name)_Goal> GoalType = @(type_name)_Goal.class; + + public static final Class<@(type_name)_Result> ResultType = @(type_name)_Result.class; + + public static final Class<@(type_name)_Feedback> FeedbackType = @(type_name)_Feedback.class; } From f7d7f557acc63f05804a33daaa212e13090bb208 Mon Sep 17 00:00:00 2001 From: Jacob Perron Date: Wed, 13 Jan 2021 12:15:14 -0800 Subject: [PATCH 6/7] Parameterize goal request and response interfaces on action type Signed-off-by: Jacob Perron --- .../org/ros2/rcljava/interfaces/GoalRequestDefinition.java | 2 +- .../org/ros2/rcljava/interfaces/GoalResponseDefinition.java | 2 +- rosidl_generator_java/resource/action.java.em | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/rcljava_common/src/main/java/org/ros2/rcljava/interfaces/GoalRequestDefinition.java b/rcljava_common/src/main/java/org/ros2/rcljava/interfaces/GoalRequestDefinition.java index d70f099e..cf6dc177 100644 --- a/rcljava_common/src/main/java/org/ros2/rcljava/interfaces/GoalRequestDefinition.java +++ b/rcljava_common/src/main/java/org/ros2/rcljava/interfaces/GoalRequestDefinition.java @@ -17,7 +17,7 @@ import java.util.List; -public interface GoalRequestDefinition extends MessageDefinition { +public interface GoalRequestDefinition extends MessageDefinition { MessageDefinition getGoal(); List getGoalUuid(); } diff --git a/rcljava_common/src/main/java/org/ros2/rcljava/interfaces/GoalResponseDefinition.java b/rcljava_common/src/main/java/org/ros2/rcljava/interfaces/GoalResponseDefinition.java index c802c58e..c645cf8f 100644 --- a/rcljava_common/src/main/java/org/ros2/rcljava/interfaces/GoalResponseDefinition.java +++ b/rcljava_common/src/main/java/org/ros2/rcljava/interfaces/GoalResponseDefinition.java @@ -15,7 +15,7 @@ package org.ros2.rcljava.interfaces; -public interface GoalResponseDefinition extends MessageDefinition { +public interface GoalResponseDefinition extends MessageDefinition { void accept(boolean accepted); void setStamp(int sec, int nanosec); } diff --git a/rosidl_generator_java/resource/action.java.em b/rosidl_generator_java/resource/action.java.em index 7b158e0c..12fb29f7 100644 --- a/rosidl_generator_java/resource/action.java.em +++ b/rosidl_generator_java/resource/action.java.em @@ -80,13 +80,13 @@ import @(action_import); public class @(type_name) implements ActionDefinition { - public static class SendGoalRequest extends @(type_name)_SendGoal_Request implements GoalRequestDefinition { + public static class SendGoalRequest extends @(type_name)_SendGoal_Request implements GoalRequestDefinition<@(type_name)> { public List getGoalUuid() { return super.getGoalId().getUuid(); } } - public static class SendGoalResponse extends @(type_name)_SendGoal_Response implements GoalResponseDefinition { + public static class SendGoalResponse extends @(type_name)_SendGoal_Response implements GoalResponseDefinition<@(type_name)> { public void accept(boolean accepted) { super.setAccepted(accepted); } From 7a6a47f645c5afedbb39b760c0ec685dfcb0b5ef Mon Sep 17 00:00:00 2001 From: Jacob Perron Date: Wed, 20 Jan 2021 11:55:43 -0800 Subject: [PATCH 7/7] Fix getGoalUuid implementation It should return a List, since it is hashable. Signed-off-by: Jacob Perron --- rosidl_generator_java/resource/action.java.em | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/rosidl_generator_java/resource/action.java.em b/rosidl_generator_java/resource/action.java.em index 12fb29f7..cb6c1dd3 100644 --- a/rosidl_generator_java/resource/action.java.em +++ b/rosidl_generator_java/resource/action.java.em @@ -82,7 +82,8 @@ public class @(type_name) implements ActionDefinition { public static class SendGoalRequest extends @(type_name)_SendGoal_Request implements GoalRequestDefinition<@(type_name)> { public List getGoalUuid() { - return super.getGoalId().getUuid(); + // Return List since it's hash is based on the values (not the object pointer) + return super.getGoalId().getUuidAsList(); } }