Exemple #1
0
    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)
Exemple #2
0
    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)
Exemple #3
0
 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)
Exemple #4
0
    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)
Exemple #5
0
    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)
Exemple #6
0
    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)
Exemple #7
0
 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)