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