class CounterWithDelayActionClass(object):
    # create messages that are used to publish feedback/result
    _feedback = CounterWithDelayFeedback()
    _result = CounterWithDelayResult()

    def __init__(self, name):
        # This will be the name of the action server which clients can use to connect to.
        self._action_name = name

        # Create a simple action server of the newly defined action type and
        # specify the execute callback where the goal will be processed.
        self._as = actionlib.SimpleActionServer(self._action_name, CounterWithDelayAction, execute_cb=self.execute_cb, auto_start = False)

        # Start the action server.
        self._as.start()
        rospy.loginfo("Action server started...")

    def execute_cb(self, goal):

        counter_delay_value = 1.0
        ## Assignment 3 - Part3
        ## modify counter delay using a private parameter .
        ## Uncomment the following lines (37-41) and modify them acordingly

        # if rospy.has_param("<write your code here>"):
        #     counter_delay_value = rospy.get_param("<write your code here>")
        #     rospy.loginfo("Parameter %s was found on the parameter server. Using %fs for counter delay."%("counter_delay", counter_delay_value))
        # else:
        #     rospy.loginfo("Parameter %s not found on the parameter server. Using default value of 1.0s for counter delay.","counter_delay")

        ##  End of Assignment 3 - Part3

        # Variable for delay
        delay_rate = rospy.Rate(counter_delay_value)

        # Variable to decide the final state of the action server.
        success = True

        # publish info to the console for the user
        rospy.loginfo('%s action server is counting up to  %i with %fs delay between each count' % (self._action_name, goal.num_counts, counter_delay_value))

        # start executing the action
        for counter_idx in range(0, goal.num_counts):
            # check that preempt has not been requested by the client
            if self._as.is_preempt_requested():
                rospy.loginfo('%s: Preempted' % self._action_name)
                self._as.set_preempted()
                success = False
                break
            # publish the feedback
            self._feedback.counts_elapsed = counter_idx
            self._as.publish_feedback(self._feedback)
            # Wait for counter_delay s before incrementing the counter.
            delay_rate.sleep()

        if success:
            self._result.result_message = "Successfully completed counting."
            rospy.loginfo('%s: Succeeded' % self._action_name)
            self._as.set_succeeded(self._result)
class CounterWithDelayActionClass(object):
    # create messages that are used to publish feedback/result
    _feedback = CounterWithDelayFeedback()
    _result = CounterWithDelayResult()

    def __init__(self, name):
        # This will be the name of the action server which clients can use to connect to.
        self._action_name = name

        # Create a simple action server of the newly defined action type and
        # specify the execute callback (execute_cb) where the goal will be processed.
        self._as = actionlib.SimpleActionServer(self._action_name,
                                                CounterWithDelayAction,
                                                execute_cb=self.execute_cb,
                                                auto_start=False)

        # Start the action server.
        self._as.start()
        rospy.loginfo("Action server started...")

    def execute_cb(self, goal):
        #
        # OPTIONAL: NOT GRADED Check if the parameter for the counter delay is available on the parameter server.
        if not rospy.has_param('counter_delay'):
            rospy.loginfo(
                "Parameter %s not found on the parameter server. Using default value of 1.0s for counter delay.",
                "counter_delay")
            counter_delay = 1.0
        else:
            pass

# Get the parameter for delay between counts.
        counter_delay_value = rospy.get_param('~counter_delay')
        rospy.loginfo(
            "Parameter %s was found on the parameter server. Using %fs for counter delay."
            % ("counter_delay", counter_delay_value))

        # Variable to decide the final state of the action server.
        success = True

        # publish info to the console for the user
        rospy.loginfo(
            '%s action server is counting up to  %i with %fs delay between each count'
            % (self._action_name, goal.num_counts, counter_delay_value))

        # start executing the action
        for counter_idx in range(0, goal.num_counts):
            # check that preempt has not been requested by the client
            if self._as.is_preempt_requested():
                rospy.loginfo('%s: Preempted' % self._action_name)
                self._as.set_preempted()
                success = False
                break

            # publish the feedback
            self._feedback.counts_elapsed = counter_idx
            self._as.publish_feedback(self._feedback)
            # Wait for counter_delay s before incrementing the counter.
            rospy.sleep(counter_delay)

        if success:
            self._result.result_message = "Successfully completed counting."
            rospy.loginfo('%s: Succeeded' % self._action_name)
            self._as.set_succeeded(self._result)