def create_destructor_artifact(self): destructor_artifact = Artifact(kind="snippet", name="destructor") destructor_template = Template( "$comment" + "$component::~$component() {\n" + "$timer_stop" + "$pub_shutdown" + "$sub_shutdown" + "$server_shutdown" + "$client_shutdown" + "$bl_start_marker\n" + "$preserved_bl" "$bl_end_marker\n" + "}\n\n" ) # Resolving the template dest_comment = "/**\n * @brief Component Shutdown\n" dest_comment += " * Cleans up all component ports and timers\n" dest_comment += " */\n" comment = dest_comment component_name = self["name"].value bl_start_marker = " //# Start destructor business logic" bl_end_marker = " //# End destructor business logic" if "destructor_business_logic" in self.kwargs.keys(): preserved_bl = self.kwargs["destructor_business_logic"] else: preserved_bl = "" timers = "" for timer in self.get_children("Timer"): timers += " {}.stop()\n".format(timer["name"].value) publishers = "" for pub in self.get_children("Publisher"): publishers += " {}.shutdown()\n".format(pub["name"].value) subscribers = "" for sub in self.get_children("Subscriber"): subscribers += " {}.shutdown()\n".format(sub["name"].value) servers = "" for server in self.get_children("Server"): servers += " {}.shutdown()\n".format(server["name"].value) clients = "" for client in self.get_children("Client"): clients += " {}.shutdown()\n".format(client["name"].value) destructor_artifact.value = destructor_template.substitute( comment=comment, component=component_name, timer_stop=timers, pub_shutdown=publishers, sub_shutdown=subscribers, server_shutdown=servers, client_shutdown=clients, bl_start_marker=bl_start_marker, preserved_bl=preserved_bl, bl_end_marker=bl_end_marker, ) self.artifacts.append(destructor_artifact)
def create_server_artifact(self): server_artifact = Artifact(kind="snippet", name="server_callback") service = self['service_reference'].value service_name = service['name'].value package_name = service.parent['name'].value # Template for a server operation server_template\ = Template('$comment' +\ '$return_type $component::$callback($args) {\n' +\ '$bl_start_marker\n' +\ '$preserved_bl' +\ '$bl_end_marker\n}' +\ '\n\n') # Resolving the template server_comment = "/**\n * @brief Server Operation - {}\n"\ .format(self['name'].value) server_comment += " * @param req Received service request\n" server_comment += " * @param res Returned service response\n" server_comment += " * @return Success/Failure of server operation\n" server_comment += " */\n" comment = server_comment return_type = "bool" component_name = self.parent['name'].value callback_name = "{}_callback".format(self['name'].value) service_name = self['service_reference'].value['name'].value service_parent = self['service_reference'].value.parent['name'].value callback_args = "const {0}::{1}::Request& req,\n {0}::{1}::Response &res"\ .format(service_parent, service_name) bl_start_marker = " //# Start {} business logic".format(self['name'].value) bl_end_marker = " //# End {} business logic".format(self['name'].value) srv_key = "{}_operation".format(self['name'].value) if srv_key in self.parent.kwargs.keys(): preserved_bl = self.parent.kwargs[srv_key] else: preserved_bl = "" server_artifact.value = server_template.\ substitute(comment=comment, return_type=return_type, component=component_name, callback=callback_name, args=callback_args, bl_start_marker=bl_start_marker, preserved_bl=preserved_bl, bl_end_marker=bl_end_marker) self.artifacts.append(server_artifact)
def create_cpp_artifact(self): src_dir = os.path.join(self.parent.get_artifact("src").destination, "src") cpp_dir = os.path.join(src_dir, self.parent["name"].value) cpp_artifact = Artifact(kind="code", destination=cpp_dir, name=self["name"].value + ".cpp") cpp_artifact.order = [ "headers", "initialization", "timer_callback", "server_callback", "subscriber_callback", "destructor", "startup", ] self.artifacts.append(cpp_artifact)
def create_subscriber_artifact(self): sub_comment = "/**\n * @brief Subscriber Operation - {}\n"\ .format(self['name'].value) sub_comment += " * @param received_data Received message\n" sub_comment += " */\n" subscriber_artifact = Artifact(kind="snippet", name="subscriber_callback") # Template for a subscriber operation subscriber_template\ = Template('$comment' +\ '$return_type $component::$callback($args) {\n' +\ '$bl_start_marker\n' +\ '$preserved_bl' +\ '$bl_end_marker\n}\n\n') # Resolving the template comment = sub_comment return_type = "void" component_name = self.parent['name'].value callback_name = "{}_callback".format(self['name'].value) message_name = self['message_reference'].value['name'].value message_parent = self['message_reference'].value.parent['name'].value callback_args = "const {}::{}::ConstPtr& received_data".format\ (message_parent, message_name) bl_start_marker = " //# Start {} business logic".format(self['name'].value) bl_end_marker = " //# End {} business logic".format(self['name'].value) sub_key = "{}_operation".format(self['name'].value) if sub_key in self.parent.kwargs.keys(): preserved_bl = self.parent.kwargs[sub_key] else: preserved_bl = "" subscriber_artifact.value = subscriber_template.\ substitute(comment=comment, return_type=return_type, component=component_name, callback=callback_name, args=callback_args, bl_start_marker=bl_start_marker, preserved_bl=preserved_bl, bl_end_marker=bl_end_marker) self.artifacts.append(subscriber_artifact)
def create_timer_artifact(self): timer_comment = "/**\n * @brief Timer Operation - {}\n"\ .format(self['name'].value) timer_comment += " * @param event Time-triggered event\n" timer_comment += " */\n" timer_artifact = Artifact(kind="snippet", name="timer_callback") # Template for a timer operation timer_template\ = Template('$comment' +\ '$return_type $component::$callback($args) {\n' +\ '$bl_start_marker\n' +\ '$preserved_bl' '$bl_end_marker\n}\n\n') # Resolving the template comment = timer_comment return_type = "void" component_name = self.parent['name'].value callback_name = "{}_callback".format(self['name'].value) callback_args = "const rosmod::TimerEvent& event" bl_start_marker = " //# Start {} business logic".format(self['name'].value) bl_end_marker = " //# End {} business logic".format(self['name'].value) timer_key = "{}_operation".format(self['name'].value) if timer_key in self.parent.kwargs.keys(): preserved_bl = self.parent.kwargs[timer_key] else: preserved_bl = "" timer_artifact.value\ = timer_template.substitute(comment=comment, return_type=return_type, component=component_name, callback=callback_name, args=callback_args, bl_start_marker=bl_start_marker, preserved_bl=preserved_bl, bl_end_marker=bl_end_marker) self.artifacts.append(timer_artifact)
def create_init_artifact(self): init_artifact = Artifact(kind="snippet", name="initialization") # Template for a init init_template = Template( "$comment" + "$return_type $component::init_timer_callback($args) {\n" + "$bl_start_marker\n" + "$preserved_bl" + "$bl_end_marker\n}" + "\n\n" ) # Resolving the template init_comment = "/**\n * @brief Component Initialization\n" init_comment += " * @param event Time-triggered event during component startup\n" init_comment += " * @see startup()\n" init_comment += " */\n" comment = init_comment return_type = "void" component_name = self["name"].value callback_args = "const rosmod::TimerEvent& event" bl_start_marker = " //# Start init_timer business logic" bl_end_marker = " //# End init_timer business logic" if "init_timer_business_logic" in self.kwargs.keys(): preserved_bl = self.kwargs["init_timer_business_logic"] else: preserved_bl = "" init_artifact.value = init_template.substitute( comment=comment, return_type=return_type, component=component_name, args=callback_args, bl_start_marker=bl_start_marker, preserved_bl=preserved_bl, bl_end_marker=bl_end_marker, ) self.artifacts.append(init_artifact)
def create_hpp_artifact(self): include_dir = os.path.join(self.parent.get_artifact("include").destination, "include") hpp_dir = os.path.join(include_dir, self.parent["name"].value) hpp_artifact = Artifact(kind="code", destination=hpp_dir, name=self["name"].value + ".hpp") hpp_artifact.order = [ "header_define", "includes", "globals", "class", "timer_callback_declaration", "server_callback_declaration", "subscriber_callback_declaration", "startup_declaration", "destructor_declaration", "timer_declaration", "publisher_declaration", "subscriber_declaration", "server_declaration", "client_declaration", "privates", ] self.artifacts.append(hpp_artifact)