Skip to content

Commit 715be2c

Browse files
authored
Merge pull request #88 from eitanme/wait-on-terminal-status
Wait for both terminal status and result before marking a goal as finished
2 parents 87be2b9 + 4c9e599 commit 715be2c

File tree

2 files changed

+17
-4
lines changed

2 files changed

+17
-4
lines changed

CHANGELOG.rst

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@ Unreleased
1919

2020
**Fixed**
2121

22+
* Fixed #87 where a goal could be marked as terminal on result alone rather
23+
than both result and status.
24+
2225
**Deprecated**
2326

2427
**Removed**

src/roslibpy/actionlib.py

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,8 @@ def send(self, result_callback=None, timeout=None):
120120
if result_callback:
121121
self.on('result', result_callback)
122122

123+
self.status = {'status': GoalStatus.PENDING}
124+
123125
self.action_client.goal_topic.publish(self.goal_message)
124126
if timeout:
125127
self.action_client.ros.call_later(timeout, self._trigger_timeout)
@@ -150,22 +152,32 @@ def _trigger_timeout(self):
150152

151153
def _set_status(self, status):
152154
self.status = status
155+
if self.is_finished:
156+
self.wait_result.set()
153157

154158
def _set_result(self, result):
155159
self.result = result
156-
self.wait_result.set()
160+
if self.is_finished:
161+
self.wait_result.set()
157162

158163
def _set_feedback(self, feedback):
159164
self.feedback = feedback
160165

166+
@property
167+
def is_active(self):
168+
if self.status is None:
169+
return False
170+
return (self.status['status'] == GoalStatus.ACTIVE or
171+
self.status['status'] == GoalStatus.PENDING)
172+
161173
@property
162174
def is_finished(self):
163175
"""Indicate if the goal is finished or not.
164176
165177
Returns:
166178
bool: True if finished, False otherwise.
167179
"""
168-
return self.result is not None
180+
return self.result is not None and not self.is_active
169181

170182

171183
class ActionClient(EventEmitterMixin):
@@ -236,15 +248,13 @@ def _on_feedback_message(self, message):
236248
goal = self.goals.get(goal_id, None)
237249

238250
if goal:
239-
goal.emit('status', message['status'])
240251
goal.emit('feedback', message['feedback'])
241252

242253
def _on_result_message(self, message):
243254
goal_id = message['status']['goal_id']['id']
244255
goal = self.goals.get(goal_id, None)
245256

246257
if goal:
247-
goal.emit('status', message['status'])
248258
goal.emit('result', message['result'])
249259

250260
def add_goal(self, goal):

0 commit comments

Comments
 (0)