$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 os, os.path 00035 import errno 00036 from optparse import OptionParser 00037 00038 IODELIM = '---' 00039 AUTOGEN="# ====== DO NOT MODIFY! AUTOGENERATED FROM AN ACTION DEFINITION ======\n" 00040 00041 class ActionSpecException(Exception): pass 00042 00043 def parse_action_spec(text, package_context = ''): 00044 pieces = [cStringIO.StringIO()] 00045 for l in text.split('\n'): 00046 if l.startswith(IODELIM): 00047 pieces.append(cStringIO.StringIO()) 00048 else: 00049 pieces[-1].write(l + '\n') 00050 return [p.getvalue() for p in pieces] 00051 00052 def write_file(filename, text): 00053 f = open(filename, 'w') 00054 f.write(text) 00055 f.close() 00056 00057 def main(): 00058 00059 parser = OptionParser("Actionlib generator") 00060 parser.add_option('-o', dest='output_dir', 00061 help='output directory') 00062 00063 (options, args) = parser.parse_args(sys.argv) 00064 00065 pkg = os.path.abspath(sys.argv[1]) 00066 filename = sys.argv[2] 00067 00068 output_dir = options.output_dir 00069 00070 # Try to make the directory, but silently continue if it already exists 00071 try: 00072 os.makedirs(output_dir) 00073 except OSError, e: 00074 if e.errno == errno.EEXIST: 00075 pass 00076 else: 00077 raise 00078 00079 action_file = args[1] 00080 if not action_file.endswith('.action'): 00081 print "The file specified has the wrong extension. It must end in .action" 00082 else: 00083 filename = action_file 00084 00085 f = open(filename) 00086 action_spec = f.read() 00087 f.close() 00088 00089 name = os.path.basename(filename)[:-7] 00090 print "Generating for action %s" % name 00091 00092 pieces = parse_action_spec(action_spec) 00093 if len(pieces) != 3: 00094 raise ActionSpecException("%s: wrong number of pieces, %d"%(filename,len(pieces))) 00095 goal, result, feedback = pieces 00096 00097 action_msg = AUTOGEN + """ 00098 %sActionGoal action_goal 00099 %sActionResult action_result 00100 %sActionFeedback action_feedback 00101 """ % (name, name, name) 00102 00103 goal_msg = AUTOGEN + goal 00104 action_goal_msg = AUTOGEN + """ 00105 Header header 00106 actionlib_msgs/GoalID goal_id 00107 %sGoal goal 00108 """ % name 00109 00110 result_msg = AUTOGEN + result 00111 action_result_msg = AUTOGEN + """ 00112 Header header 00113 actionlib_msgs/GoalStatus status 00114 %sResult result 00115 """ % name 00116 00117 feedback_msg = AUTOGEN + feedback 00118 action_feedback_msg = AUTOGEN + """ 00119 Header header 00120 actionlib_msgs/GoalStatus status 00121 %sFeedback feedback 00122 """ % name 00123 00124 write_file(os.path.join(output_dir, "%sAction.msg"%name), action_msg) 00125 write_file(os.path.join(output_dir, "%sGoal.msg"%name), goal_msg) 00126 write_file(os.path.join(output_dir, "%sActionGoal.msg"%name), action_goal_msg) 00127 write_file(os.path.join(output_dir, "%sResult.msg"%name), result_msg) 00128 write_file(os.path.join(output_dir, "%sActionResult.msg"%name), action_result_msg) 00129 write_file(os.path.join(output_dir, "%sFeedback.msg"%name), feedback_msg) 00130 write_file(os.path.join(output_dir, "%sActionFeedback.msg"%name), action_feedback_msg) 00131 00132 00133 if __name__ == '__main__': main()