$search
00001 #! /usr/bin/env python 00002 # Copyright (c) 2009, Willow Garage, Inc. 00003 # All rights reserved. 00004 # 00005 # Redistribution and use in source and binary forms, with or without 00006 # modification, are permitted provided that the following conditions are met: 00007 # 00008 # * Redistributions of source code must retain the above copyright 00009 # notice, this list of conditions and the following disclaimer. 00010 # * Redistributions in binary form must reproduce the above copyright 00011 # notice, this list of conditions and the following disclaimer in the 00012 # documentation and/or other materials provided with the distribution. 00013 # * Neither the name of the Willow Garage, Inc. nor the names of its 00014 # contributors may be used to endorse or promote products derived from 00015 # this software without specific prior written permission. 00016 # 00017 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 00018 # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 00019 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 00020 # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 00021 # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 00022 # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 00023 # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 00024 # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 00025 # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 00026 # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 00027 # POSSIBILITY OF SUCH DAMAGE. 00028 00029 # Author: Stuart Glaser 00030 00031 import sys 00032 import cStringIO 00033 import re 00034 import rosidl, rosidl.msgs 00035 import os, os.path 00036 import errno 00037 from optparse import OptionParser 00038 00039 IODELIM = '---' 00040 COMMENTCHAR = rosidl.msgs.COMMENTCHAR 00041 AUTOGEN="# ====== DO NOT MODIFY! AUTOGENERATED FROM AN ACTION DEFINITION ======\n" 00042 00043 class ActionSpecException(Exception): pass 00044 00045 def parse_action_spec(text, package_context = ''): 00046 pieces = [cStringIO.StringIO()] 00047 for l in text.split('\n'): 00048 if l.startswith(IODELIM): 00049 pieces.append(cStringIO.StringIO()) 00050 else: 00051 pieces[-1].write(l + '\n') 00052 return [p.getvalue() for p in pieces] 00053 00054 def write_file(filename, text): 00055 f = open(filename, 'w') 00056 f.write(text) 00057 f.close() 00058 00059 def main(): 00060 00061 parser = OptionParser("Actionlib generator") 00062 parser.add_option('-o', dest='output_dir', 00063 help='output directory') 00064 00065 (options, args) = parser.parse_args(sys.argv) 00066 00067 pkg = os.path.abspath(sys.argv[1]) 00068 filename = sys.argv[2] 00069 00070 output_dir = options.output_dir 00071 00072 # Try to make the directory, but silently continue if it already exists 00073 try: 00074 os.makedirs(output_dir) 00075 except OSError, e: 00076 if e.errno == errno.EEXIST: 00077 pass 00078 else: 00079 raise 00080 00081 action_file = args[1] 00082 if not action_file.endswith('.action'): 00083 print "The file specified has the wrong extension. It must end in .action" 00084 else: 00085 filename = action_file 00086 00087 f = open(filename) 00088 action_spec = f.read() 00089 f.close() 00090 00091 name = os.path.basename(filename)[:-7] 00092 print "Generating for action %s" % name 00093 00094 pieces = parse_action_spec(action_spec) 00095 if len(pieces) != 3: 00096 raise ActionSpecException("%s: wrong number of pieces, %d"%(filename,len(pieces))) 00097 goal, result, feedback = pieces 00098 00099 action_msg = AUTOGEN + """ 00100 %sActionGoal action_goal 00101 %sActionResult action_result 00102 %sActionFeedback action_feedback 00103 """ % (name, name, name) 00104 00105 goal_msg = AUTOGEN + goal 00106 action_goal_msg = AUTOGEN + """ 00107 Header header 00108 actionlib_msgs/GoalID goal_id 00109 %sGoal goal 00110 """ % name 00111 00112 result_msg = AUTOGEN + result 00113 action_result_msg = AUTOGEN + """ 00114 Header header 00115 actionlib_msgs/GoalStatus status 00116 %sResult result 00117 """ % name 00118 00119 feedback_msg = AUTOGEN + feedback 00120 action_feedback_msg = AUTOGEN + """ 00121 Header header 00122 actionlib_msgs/GoalStatus status 00123 %sFeedback feedback 00124 """ % name 00125 00126 write_file(os.path.join(output_dir, "%sAction.msg"%name), action_msg) 00127 write_file(os.path.join(output_dir, "%sGoal.msg"%name), goal_msg) 00128 write_file(os.path.join(output_dir, "%sActionGoal.msg"%name), action_goal_msg) 00129 write_file(os.path.join(output_dir, "%sResult.msg"%name), result_msg) 00130 write_file(os.path.join(output_dir, "%sActionResult.msg"%name), action_result_msg) 00131 write_file(os.path.join(output_dir, "%sFeedback.msg"%name), feedback_msg) 00132 write_file(os.path.join(output_dir, "%sActionFeedback.msg"%name), action_feedback_msg) 00133 00134 00135 if __name__ == '__main__': main()