diff --git a/scripts/catkin_create_rosjava_library_project b/scripts/catkin_create_rosjava_library_project new file mode 100755 index 0000000000000000000000000000000000000000..dcc1d8960a83486269c0e722e495853ed99e2dbb --- /dev/null +++ b/scripts/catkin_create_rosjava_library_project @@ -0,0 +1,24 @@ +#!/usr/bin/env python + +"""This script creates the skeleton of a rosjava library project""" + +############################################################################## +# Imports +############################################################################## + +from __future__ import print_function +import sys + +from rosjava_build_tools import create_rosjava_library_project +import rosjava_build_tools.console as console + +############################################################################## +# Main +############################################################################## + +if __name__ == "__main__": + try: + sys.exit(create_rosjava_library_project()) + except Exception as e: + console.logerror("%s : %s" % (str(e), type(e))) + sys.exit(1) diff --git a/scripts/catkin_create_rosjava_msg_project b/scripts/catkin_create_rosjava_msg_project index afedb840c9ff6c0d9a1b6ef2ba31c20b9046ee43..30cb5962efcd9438b7f1b703186fde297472c247 100755 --- a/scripts/catkin_create_rosjava_msg_project +++ b/scripts/catkin_create_rosjava_msg_project @@ -1,6 +1,6 @@ #!/usr/bin/env python -"""This script creates the skeleton of an android library package""" +"""This script creates the skeleton of a rosjava message project""" ############################################################################## # Imports diff --git a/scripts/catkin_create_rosjava_pkg b/scripts/catkin_create_rosjava_pkg index b21eb85e282c42682d2785177897b461bef858e9..fb533b86e3ff776036143832a30865119b026931 100755 --- a/scripts/catkin_create_rosjava_pkg +++ b/scripts/catkin_create_rosjava_pkg @@ -1,6 +1,6 @@ #!/usr/bin/env python -"""This script creates the skeleton of an rosjava repo""" +"""This script creates the skeleton of a rosjava catkin package (typically an entire repo)""" ############################################################################## # Imports diff --git a/scripts/catkin_create_rosjava_project b/scripts/catkin_create_rosjava_project index 9a2a34660f9000acffd19325dc986adf94307ad6..ac9c3545f59484984ab0b8d2e82c82d4905f5497 100755 --- a/scripts/catkin_create_rosjava_project +++ b/scripts/catkin_create_rosjava_project @@ -1,6 +1,6 @@ #!/usr/bin/env python -"""This script creates the skeleton of an android library package""" +"""This script creates the skeleton of a rosjava application project""" ############################################################################## # Imports diff --git a/setup.py b/setup.py index ab25ba3713b39c09a44eed9c2789ba331ced8457..56f6f354b5230fc1b593bbdb1985ea72588ffdef 100644 --- a/setup.py +++ b/setup.py @@ -11,11 +11,13 @@ d = generate_distutils_setup( 'scripts/catkin_create_android_library_project', 'scripts/catkin_create_rosjava_pkg', 'scripts/catkin_create_rosjava_project', + 'scripts/catkin_create_rosjava_library_project', 'scripts/catkin_create_rosjava_msg_project', ], package_data = {'rosjava_build_tools': [ 'templates/android_package/*', 'templates/android_project/*', + 'templates/rosjava_library_project/*', 'templates/rosjava_msg_project/*', 'templates/rosjava_package/*', 'templates/rosjava_project/*', diff --git a/src/rosjava_build_tools/__init__.py b/src/rosjava_build_tools/__init__.py index 1b912767d5c0cc4cc684f798e58e327112eac0e4..736d86c99737f8789ad8253529b4ba174cbee618 100644 --- a/src/rosjava_build_tools/__init__.py +++ b/src/rosjava_build_tools/__init__.py @@ -7,6 +7,6 @@ import console from create_package import init_android_package, init_rosjava_package from create_android_project import create_android_project -from create_rosjava_project import create_rosjava_project, create_rosjava_msg_project +from create_rosjava_project import create_rosjava_project, create_rosjava_msg_project, create_rosjava_library_project from utils import which from release import scrape_for_release_message_packages diff --git a/src/rosjava_build_tools/create_rosjava_project.py b/src/rosjava_build_tools/create_rosjava_project.py index 3acd167409713d57806371b2377e154ecedb3a85..bf0acf294c685cc8b8d173c322e33f103f1d6520 100644 --- a/src/rosjava_build_tools/create_rosjava_project.py +++ b/src/rosjava_build_tools/create_rosjava_project.py @@ -46,6 +46,10 @@ def instantiate_template(template, project_name, author): return template % locals() +def instantiate_code_template(template, package_name, project_name, author): + return template % locals() + + def create_gradle_package_files(args, template_directory): ''' This is almost a direct copy from catkin_create_pkg. @@ -68,6 +72,27 @@ def create_gradle_package_files(args, template_directory): raise +def create_talker_listener_classes(project_name, template_directory, author): + path = os.path.join(os.getcwd(), project_name.lower()) + package_name = os.path.basename(os.getcwd()) + java_package_path = os.path.join(path, 'src', 'main', 'java', 'com', 'github', package_name, project_name) + utils.mkdir_p(java_package_path) + try: + for template_name in ['Talker.java', 'Listener.java']: + filename = os.path.join(java_package_path, template_name) + template = utils.read_template_file(template_directory, template_name) + contents = instantiate_code_template(template, package_name, project_name, author) + try: + f = open(filename, 'w') + f.write(contents) + console.pretty_print(' File : ', console.cyan) + console.pretty_println(template_name, console.yellow) + finally: + f.close() + except Exception: + raise + + def add_to_root_gradle_settings(name): ''' Adds project name to the root level settings.gradle file. @@ -126,9 +151,33 @@ def add_to_package_xml(name): package_xml.write(new_contents) +def add_install_app_to_cmake_targets(): + ''' + Adds project name to build_depends in package.xml (should be same name as the ros msg package name). + ''' + for rel_path in ['.', '..']: + cmakelists_txt_path = os.path.join(os.getcwd(), rel_path, 'CMakeLists.txt') + if os.path.isfile(cmakelists_txt_path): + break + else: + cmakelists_txt_path = None + if cmakelists_txt_path is None: + console.pretty_println("\nCouldn't find the root level CMakeLists.txt - not adding to the superproject.") + return + with open(cmakelists_txt_path, 'r') as cmakelists_txt: + console.pretty_print(' File : ', console.cyan) + console.pretty_println('CMakeLists.txt (gradle task update)', console.yellow) + old_text = 'catkin_rosjava_setup(publishMavenJavaPublicationToMavenRepository)' + new_text = 'catkin_rosjava_setup(publishMavenJavaPublicationToMavenRepository installApp)' + new_contents = cmakelists_txt.read().replace(old_text, new_text) + with open(cmakelists_txt_path, 'w') as cmakelists_txt: + cmakelists_txt.write(new_contents) + + def create_dummy_java_class(project_name): path = os.path.join(os.getcwd(), project_name.lower()) - java_package_path = os.path.join(path, 'src', 'main', 'java', 'com', 'github', 'rosjava', project_name) + package_name = os.path.basename(os.getcwd()) + java_package_path = os.path.join(path, 'src', 'main', 'java', 'com', 'github', package_name, project_name) utils.mkdir_p(java_package_path) filename = os.path.join(java_package_path, 'Dude.java') java_class = "package com.github.rosjava.%s.Dude;\n" % project_name @@ -170,12 +219,23 @@ def create_rosjava_project_common(args, template_directory): def create_rosjava_project(): args = parse_arguments() + project_name = args.name[0] + author = args.author create_rosjava_project_common(args, 'rosjava_project') - create_dummy_java_class(args.name[0]) + create_talker_listener_classes(project_name, 'rosjava_project', author) + add_install_app_to_cmake_targets() + + +def create_rosjava_library_project(): + args = parse_arguments() + project_name = args.name[0] + create_rosjava_project_common(args, 'rosjava_library_project') + create_dummy_java_class(project_name) def create_rosjava_msg_project(): args = parse_arguments() + project_name = args.name[0] create_rosjava_project_common(args, 'rosjava_msg_project') add_catkin_generate_tree_command() - add_to_package_xml(args.name[0]) + add_to_package_xml(project_name) diff --git a/src/rosjava_build_tools/templates/android_package/build.gradle.in b/src/rosjava_build_tools/templates/android_package/build.gradle.in index 09cc556c18eac1a48c5976457779ab118ed8a819..32a05320fb1285b4c17bc437236cc882d8e24cfc 100644 --- a/src/rosjava_build_tools/templates/android_package/build.gradle.in +++ b/src/rosjava_build_tools/templates/android_package/build.gradle.in @@ -1,5 +1,5 @@ /* - * Copyright (C) 2013 %(author)s + * Copyright (C) 2014 %(author)s * * 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 diff --git a/src/rosjava_build_tools/templates/android_package/settings.gradle b/src/rosjava_build_tools/templates/android_package/settings.gradle index 00841924d83ea9d3bf07fc35858bdce88e7c4733..f8618db1853eb6742ea75293e5b575c396dc40ed 100644 --- a/src/rosjava_build_tools/templates/android_package/settings.gradle +++ b/src/rosjava_build_tools/templates/android_package/settings.gradle @@ -1,5 +1,5 @@ /* - * Copyright (C) 2013 %(author)s + * Copyright (C) 2014 %(author)s * * 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 diff --git a/src/rosjava_build_tools/templates/android_project/build.gradle.in b/src/rosjava_build_tools/templates/android_project/build.gradle.in index d2da1a7ec0d17f42751985dddccf219233c3fd07..e7e6326bb4e582c6e0a3e5e40648d64af8a5bdf4 100644 --- a/src/rosjava_build_tools/templates/android_project/build.gradle.in +++ b/src/rosjava_build_tools/templates/android_project/build.gradle.in @@ -1,5 +1,5 @@ /* - * Copyright (C) 2013 %(author)s. + * Copyright (C) 2014 %(author)s. * * 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 diff --git a/src/rosjava_build_tools/templates/rosjava_library_project/build.gradle.in b/src/rosjava_build_tools/templates/rosjava_library_project/build.gradle.in new file mode 100644 index 0000000000000000000000000000000000000000..f76d5d9ce63f28d7fab08bd85a2f9a47a133c22c --- /dev/null +++ b/src/rosjava_build_tools/templates/rosjava_library_project/build.gradle.in @@ -0,0 +1,31 @@ +/* + * Copyright (C) 2014 %(author)s. + * + * 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. + */ + +/* + Dependencies can be on external maven artifacts (such as rosjava_core + here) or on sibling subprojects. Fpr external maven artifact dependencies + it's convenient to use an open ranged dependency, but restrict it to + cover the patch version only to avoid breakages due to api changes + which usually occur on minor and major version numbers. +*/ + +dependencies { + /* Example of an external maven artifact dependency */ + /* compile 'org.ros.rosjava_core:rosjava:[0.1,)' */ + /* Example of a local subproject dependency */ + /* compile project(':sibling_gradle_project') */ +} + diff --git a/src/rosjava_build_tools/templates/rosjava_msg_project/build.gradle.in b/src/rosjava_build_tools/templates/rosjava_msg_project/build.gradle.in index d13df141ba2b8d7caa56eebb703290db7b3b4bfb..5d4f66a0433ac2f74ec89af5bfd9a2bd39ae60ff 100644 --- a/src/rosjava_build_tools/templates/rosjava_msg_project/build.gradle.in +++ b/src/rosjava_build_tools/templates/rosjava_msg_project/build.gradle.in @@ -1,5 +1,5 @@ /* - * Copyright (C) 2013 %(author)s. + * Copyright (C) 2014 %(author)s. * * 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 diff --git a/src/rosjava_build_tools/templates/rosjava_package/CMakeLists.txt.in b/src/rosjava_build_tools/templates/rosjava_package/CMakeLists.txt.in index ab5fa4b8ce45e2c604255e3068cb037ef42f639b..996231d7dacea630cdb4ae56f87b2230fe953500 100644 --- a/src/rosjava_build_tools/templates/rosjava_package/CMakeLists.txt.in +++ b/src/rosjava_build_tools/templates/rosjava_package/CMakeLists.txt.in @@ -11,7 +11,7 @@ project(%(repo_name)s) find_package(catkin REQUIRED rosjava_build_tools) # Set the gradle targets you want catkin's make to run by default -catkin_android_setup(publishMavenJavaPublicationToMavenRepository) +catkin_rosjava_setup(publishMavenJavaPublicationToMavenRepository) catkin_package() ############################################################################## diff --git a/src/rosjava_build_tools/templates/rosjava_package/build.gradle.in b/src/rosjava_build_tools/templates/rosjava_package/build.gradle.in index 090aace20d346f3aa07cf9b5d09a10f06b80b8e4..a93ab9775f4a54063e4394140db52fe5b5991688 100644 --- a/src/rosjava_build_tools/templates/rosjava_package/build.gradle.in +++ b/src/rosjava_build_tools/templates/rosjava_package/build.gradle.in @@ -1,5 +1,5 @@ /* - * Copyright (C) 2013 %(author)s + * Copyright (C) 2014 %(author)s * * 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 diff --git a/src/rosjava_build_tools/templates/rosjava_project/Listener.java.in b/src/rosjava_build_tools/templates/rosjava_project/Listener.java.in new file mode 100644 index 0000000000000000000000000000000000000000..6875a6d045e503949de55bd20aed53e91e9ce3fe --- /dev/null +++ b/src/rosjava_build_tools/templates/rosjava_project/Listener.java.in @@ -0,0 +1,48 @@ +/* + * Copyright (C) 2014 %(author)s. + * + * 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 com.github.%(package_name)s.%(project_name)s; + +import org.apache.commons.logging.Log; +import org.ros.message.MessageListener; +import org.ros.namespace.GraphName; +import org.ros.node.AbstractNodeMain; +import org.ros.node.ConnectedNode; +import org.ros.node.NodeMain; +import org.ros.node.topic.Subscriber; + +/** + * A simple {@link Subscriber} {@link NodeMain}. + */ +public class Listener extends AbstractNodeMain { + + @Override + public GraphName getDefaultNodeName() { + return GraphName.of("rosjava/listener"); + } + + @Override + public void onStart(ConnectedNode connectedNode) { + final Log log = connectedNode.getLog(); + Subscriber<std_msgs.String> subscriber = connectedNode.newSubscriber("chatter", std_msgs.String._TYPE); + subscriber.addMessageListener(new MessageListener<std_msgs.String>() { + @Override + public void onNewMessage(std_msgs.String message) { + log.info("I heard: \"" + message.getData() + "\""); + } + }); + } +} diff --git a/src/rosjava_build_tools/templates/rosjava_project/Talker.java.in b/src/rosjava_build_tools/templates/rosjava_project/Talker.java.in new file mode 100644 index 0000000000000000000000000000000000000000..3522a9f0cd73f57a50709be7d69777455f3fa322 --- /dev/null +++ b/src/rosjava_build_tools/templates/rosjava_project/Talker.java.in @@ -0,0 +1,60 @@ +/* + * Copyright (C) 2014 %(author)s. + * + * 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 com.github.%(package_name)s.%(project_name)s; + +import org.ros.concurrent.CancellableLoop; +import org.ros.namespace.GraphName; +import org.ros.node.AbstractNodeMain; +import org.ros.node.ConnectedNode; +import org.ros.node.NodeMain; +import org.ros.node.topic.Publisher; + +/** + * A simple {@link Publisher} {@link NodeMain}. + */ +public class Talker extends AbstractNodeMain { + + @Override + public GraphName getDefaultNodeName() { + return GraphName.of("rosjava/talker"); + } + + @Override + public void onStart(final ConnectedNode connectedNode) { + final Publisher<std_msgs.String> publisher = + connectedNode.newPublisher("chatter", std_msgs.String._TYPE); + // This CancellableLoop will be canceled automatically when the node shuts + // down. + connectedNode.executeCancellableLoop(new CancellableLoop() { + private int sequenceNumber; + + @Override + protected void setup() { + sequenceNumber = 0; + } + + @Override + protected void loop() throws InterruptedException { + std_msgs.String str = publisher.newMessage(); + str.setData("Hello world! " + sequenceNumber); + publisher.publish(str); + sequenceNumber++; + Thread.sleep(1000); + } + }); + } +} diff --git a/src/rosjava_build_tools/templates/rosjava_project/build.gradle.in b/src/rosjava_build_tools/templates/rosjava_project/build.gradle.in index 3c7f00497e301707edce518225930a2c8244ad0e..1349e7ee46d030f13f5ea62e098614a3beac1be6 100644 --- a/src/rosjava_build_tools/templates/rosjava_project/build.gradle.in +++ b/src/rosjava_build_tools/templates/rosjava_project/build.gradle.in @@ -1,5 +1,5 @@ /* - * Copyright (C) 2013 %(author)s. + * Copyright (C) 2014 %(author)s. * * 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 @@ -14,20 +14,22 @@ * the License. */ +/* This plugin is necessary for creating installApp tasks (i.e. executables) */ +apply plugin: 'application' +mainClassName = 'org.ros.RosRun' + /* - Examples of - 1) dependencies from another project in this gradle stack. - 2,3) open ranged dependencies from a maven repository. - - It's a good idea to restrict the open ranged dependency to - the patch version to avoid breakages due to api changes - which usually occur on minor and major version numbers. + Dependencies can be on external maven artifacts (such as rosjava_core + here) or on sibling subprojects. Fpr external maven artifact dependencies + it's convenient to use an open ranged dependency, but restrict it to + cover the patch version only to avoid breakages due to api changes + which usually occur on minor and major version numbers. */ -/* + dependencies { - compile project(':local_android_library_dependency') + /* An external maven artifact dependency */ compile 'org.ros.rosjava_core:rosjava:[0.1,)' - compile 'com.github.rosjava.rosjava_extras:hokuyo:[0.1,0.2)' + /* Example of a local subproject dependency */ + /* compile project(':sibling_gradle_project') */ } -*/