public void transitionToState(ClientGoalHandle <ActionSpec> gh, CommState next_state) { ROS.Debug("actionlib", "Trying to transition to %s", next_state.toString()); setCommState(next_state); if (transitionCallback != null) { transitionCallback(gh); } }
void handleTransition(ClientGoalHandle <ActionSpec> gh) { CommState commState = gh.getCommState(); switch (commState.state) { case CommState.StateEnum.WAITING_FOR_GOAL_ACK: ROS.Error("actionlib", "BUG: Shouldn't ever get a transition callback for WAITING_FOR_GOAL_ACK"); break; case CommState.StateEnum.PENDING: if (goalState != SimpleGoalState.StateEnum.PENDING) { ROS.Error("BUG: Got a transition to CommState [%s] when our in SimpleGoalState [%s]", commState.toString(), goalState.toString()); } break; case CommState.StateEnum.ACTIVE: switch (goalState.state) { case SimpleGoalState.StateEnum.PENDING: setSimpleState(SimpleGoalState.StateEnum.ACTIVE); if (activeCallback != null) { activeCallback(); } break; case SimpleGoalState.StateEnum.ACTIVE: break; case SimpleGoalState.StateEnum.DONE: ROS.Error("actionlib", "BUG: Got a transition to CommState [%s] when in SimpleGoalState [%s]", commState.ToString(), goalState.ToString()); break; default: ROS.Error("Unknown SimpleGoalState %u", goalState.state); return; break; } break; case CommState.StateEnum.WAITING_FOR_RESULT: break; case CommState.StateEnum.WAITING_FOR_CANCEL_ACK: break; case CommState.StateEnum.RECALLING: if (goalState != SimpleGoalState.StateEnum.PENDING) { ROS.Error("BUG: Got a transition to CommState [%s] when our in SimpleGoalState [%s]", commState.ToString(), goalState.ToString()); } break; case CommState.StateEnum.PREEMPTING: switch (goalState.state) { case SimpleGoalState.StateEnum.PENDING: setSimpleState(SimpleGoalState.StateEnum.ACTIVE); if (activeCallback != null) { activeCallback(); } break; case SimpleGoalState.StateEnum.ACTIVE: break; case SimpleGoalState.StateEnum.DONE: ROS.Error("actionlib", "BUG: Got a transition to CommState [%s] when in SimpleGoalState [%s]", commState.ToString(), goalState.ToString()); break; default: ROS.Error("Unknown SimpleGoalState %u", goalState.state); return; break; } break; case CommState.StateEnum.DONE: switch (goalState.state) { case SimpleGoalState.StateEnum.PENDING: case SimpleGoalState.StateEnum.ACTIVE: lock ( doneMutex ) { setSimpleState(SimpleGoalState.StateEnum.DONE); } if (doneCallback != null) { doneCallback(getState(), gh.getResult()); } doneCondition.Set(); // doneCondition.notify_all(); break; case SimpleGoalState.StateEnum.DONE: ROS.Error("actionlib", "BUG: Got a second transition to DONE"); break; default: ROS.Error("Unknown SimpleGoalState %u", goalState.state); return; break; } break; default: ROS.Error("actionlib", "Unknown CommState received [%u]", commState.state); break; } }
/** * \brief Get the terminal state information for this goal * * Possible States Are: RECALLED, REJECTED, PREEMPTED, ABORTED, SUCCEEDED, LOST * This call only makes sense if CommState==DONE. This will send ROS_WARNs if we're not in DONE * \return The terminal state */ public TerminalState getTerminalState() { if (!isActive) { ROS.Error("actionlib", "Trying to getTerminalState on an inactive ClientGoalHandle. You are incorrectly using a ClientGoalHandle"); return(new TerminalState(TerminalState.StateEnum.LOST)); } DestructionGuard.ScopedProtector protector = new DestructionGuard.ScopedProtector(guard); if (!protector.isProtected()) { ROS.Error("actionlib", "This action client associated with the goal handle has already been destructed. Ignoring this getTerminalState() call"); return(new TerminalState(TerminalState.StateEnum.LOST)); } UnityEngine.Debug.Assert(goalManager != null); lock ( lockObject ) { CommState comm_state = listHandle.GetElement().getCommState(); // CommState comm_state = listHandle.getElem()->getCommState(); if (comm_state != CommState.StateEnum.DONE) { ROS.Warn("actionlib", "Asking for the terminal state when we're in [%s]", comm_state.toString()); } Messages.actionlib_msgs.GoalStatus goal_status = listHandle.GetElement().getGoalStatus(); // Messages.actionlib_msgs.GoalStatus goal_status = listHandle.getElem()->getGoalStatus(); switch (goal_status.status) { case gstat.PENDING: case gstat.ACTIVE: case gstat.PREEMPTING: case gstat.RECALLING: ROS.Error("actionlib", "Asking for terminal state, but latest goal status is %u", goal_status.status); return(new TerminalState(TerminalState.StateEnum.LOST, goal_status.text)); case gstat.PREEMPTED: return(new TerminalState(TerminalState.StateEnum.PREEMPTED, goal_status.text)); case gstat.SUCCEEDED: return(new TerminalState(TerminalState.StateEnum.SUCCEEDED, goal_status.text)); case gstat.ABORTED: return(new TerminalState(TerminalState.StateEnum.ABORTED, goal_status.text)); case gstat.REJECTED: return(new TerminalState(TerminalState.StateEnum.REJECTED, goal_status.text)); case gstat.RECALLED: return(new TerminalState(TerminalState.StateEnum.RECALLED, goal_status.text)); case gstat.LOST: return(new TerminalState(TerminalState.StateEnum.LOST, goal_status.text)); default: ROS.Error("actionlib", "Unknown goal status: %u", goal_status.status); break; } ROS.Error("actionlib", "Bug in determining terminal state"); return(new TerminalState(TerminalState.StateEnum.LOST, goal_status.text)); } }
void setCommState(CommState state) { ROS.Debug("actionlib", "Transitioning CommState from %s to %s", state.toString(), state.toString()); state = state; }